[SimpleXML] Problema rimozione nodo

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
23
Roma
alessandro1997.netsons.org
Ebbene sì, mi vedo costretto a chiedere aiuto anche io :D
Sto creando una chat con PHP ed XML, e, come mi immaginavo, ho incontrato grandi difficoltà lavorando con SimpleXML. Già ho dovuto fare una fatica immane per poter usare CDATA, e ora, come se non bastasse, mi si presenta quest'altro problema. Praticamente io ho bisogno di cancellare i messaggi più vecchi di 20 minuti, quindi ho creato questa funzione nella mia classe:
PHP:
private function _deleteExpired()
{
	$data = simplexml_load_file($this->db);
	$count = 0;
	
	foreach($data->message as $msg)
	{
		if(time() - $msg['timestamp'] > 60 * 20)
			unset($data->message[$count]);
		
		$count++;
	}
	
	$this->_overwriteData($data->asXML());
}
La funzione ajaxChat::_overwriteData si occupa solo di cancellare il file XML e crearne la nuova versione.

Ora, ho un problema. Praticamente non riesco a ciclare i messaggi da eliminare. Me ne elimina uno per volta, visualizzando comunque un warning "Node no longer exists". Ho provato a fare qualche prova ed effettivamente sembra che $data->message sia composto da un solo elemento, anche se, quando vado a ciclarlo, mi restituite anche gli altri. Mah...

Il file XML è una cosa di questo tipo:
HTML:
<?xml version="1.0"?>
<messages>
	<message id="1" timestamp="1266522045">
		<![CDATA[Scommetto che questo messaggio non verrà cancellato...]]>
	</message>
	<message id="2" timestamp="1266522057">
		<![CDATA[...o comunque verrà cancellato singolarmente, visualizzando un errore.]]>
	</message>
	<message id="3" timestamp="1266522072">
		<![CDATA[È praticamente tutta la giornata che sto su questo problema.]]>
	</message>
	<message id="4" timestamp="1266522077">
		<![CDATA[Avete qualche idea su come risolverlo?]]>
	</message>
	<message id="5" timestamp="1266522102">
		<![CDATA[Ah, piccolo off topic: borgo puzza.]]>
	</message>
</messages>
EDIT: Ho risolto il problema modificando la funzione così:
PHP:
private function _deleteExpired()
{
	$data = simplexml_load_file($this->db);
	
	while(time() - $data->message[0]['timestamp'] > 60 * 20)
		unset($data->message[0]);
		
	$this->_overwriteData($data->asXML());
}
Ma a me è andata bene, perché la prima occorrenza sarà sempre la più vecchia, quindi se non c'è bisogno di cancellare la prima non serve neanche farlo con la seconda. Ciò non toglie che la curiosità rimane... suggerimenti? Magari possiamo dare una mano a qualcuno che ha sputato sangue come me :D
 
Ultima modifica: