SimpleXML supprimer des nœuds
J'ai une boucle foreach qui est seulement en cours d'exécution une fois et il m'a déconcerté.
1: je charge un tableau de valeurs d'état (soit "demande", "supprimer", ou "achetés")
2: j'ai ensuite charger un fichier xml et le besoin de faire une boucle par le "code" de nœuds et de mettre à jour leur statut, MAIS si le nouveau code est "supprimer" je veux l'enlever avant de passer à la suivante
La structure XML....
<content>
.... lots of stuff
<codes>
<code date="xxx" status="request">xxxxx</code>
.. repeat ...
</codes>
</content>
et le code php ...
$newstatus = $_POST['updates'];
$file = '../apps/templates/'.$folder.'/layout.xml';
$xml2 = simplexml_load_file($file);
foreach($xml2->codes->code as $code){
if($code['status'] == "delete") {
$dom=dom_import_simplexml($code);
$dom->parentNode->removeChild($dom);
}
}
$xml2->asXml($file);
J'ai retiré temporairement la mise à jour donc je peux débogage de la suppression de la case.
Tout cela fonctionne, MAIS il supprime uniquement le 1er supprimer et laisse tous les autres supprime même si c'est une boucle foreach??.
Toute aide grandement appréciée.
- Double question, cochez la case répondre à stackoverflow.com/questions/3418197/....
- Il est probable que vous avez été copié ce code à partir de le (maintenant) a accepté de répondre de Retirer un enfant avec un attribut spécifique, dans SimpleXML PHP. Problème est, la réponse donnée est instable. Le problème avec ce code, c'est qu'elle est écrite pour un seul de supprimer uniquement après la suppression de l'itérateur a changé. Vous devez le convertir en un tableau d'abord par
iterator_to_array
ou en cas de simplexml spécifiques à l'aide de xpath. stackoverflow.com/a/16062633/367456
Vous devez vous connecter pour publier un commentaire.
La suppression de plusieurs fois dans la même itération est instable. E. g. si vous supprimez le deuxième élément, le troisième devient le deuxième et ainsi de suite.
Vous pouvez empêcher cela en stockant les éléments à supprimer dans un tableau en premier:
Et puis vous supprimez l'élément basé sur le tableau qui est stable, alors que vous parcourez c':
Vous pouvez également mettre le si-condition dans une requête xpath qui ne retourner le tableau (voir la double question pour un exemple), soit en faisant usage de
iterator_to_array()
.