[resolu] simplexml - suppression d'elements - probleme avec unset?

simplexml - suppression d'elements - probleme avec unset? [resolu] - PHP - Programmation

Marsh Posté le 22-09-2007 à 13:35:25    

hello tout le monde,
 
J'ai un petit bout de code qui me résiste depuis un bout de temps je ne parviens pas a trouver la source du probleme...
 

Code :
  1. $xml=simplexml_load_file("actus.xml" );
  2. if(isset($_POST["date"])){
  3. foreach($_POST["date"] as $val){
  4. echo $val;
  5. unset($xml->date[$val]);
  6. }
  7. $xml->asXML('actus2.xml');
  8. }


 
Ce code ne fonctionne pas chez moi, pourtant, sans rien changer d'autre, si je remplace "unset($xml->date[$val]);" par "unset($xml->date[0]);" ca marche parfaitement.
J'ai donc mis echo '$val' voir si le probleme venais de la variable passée en parametre a unset mais non... le echo me sors bien une valeure 0 ou 1 ...
Pour infos $_POST["date"] contiens les données de checkboxes d'un formulaire ayant pour noms 'date[]';
 
Je me doutes que bon nombres vont m'envoyer vers dom (j'aimerais eviter mais bon...si y'as pas d'autres solutions!) mais j'aimerais tout de meme comprendre pourquoi ca marche pas dans ce cas précis :heink:  
 
Merci a ceux qui auront un peu de temps a me consacrer  :jap:


Message édité par graphix le 23-09-2007 à 17:03:59
Reply

Marsh Posté le 22-09-2007 à 13:35:25   

Reply

Marsh Posté le 22-09-2007 à 19:49:16    

Par "ça ne marche pas" (qui ne veut en soi absolument rien dire...), je suppose que tu sous-entends que le unset ne produit aucun effet ?
 
Dis-moi ce que te sort ceci :

Code :
  1. var_dump($val);
  2. var_dump($xml->date);
  3. unset($xml->date[$val]);
  4. var_dump($xml->date);


Message édité par sielfried le 22-09-2007 à 19:49:29

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 22-09-2007 à 20:56:22    

Code :
  1. var_dump($val);
  2. var_dump($xml->date);
  3. unset($xml->date[$val]);
  4. var_dump($xml->date);
  5.  
  6. // Sortie ->
  7.  
  8. string(1) "0" object(SimpleXMLElement)#7 (2) { ["@attributes"]=> array(1) { ["name"]=> string(8) "Novembre" } ["actu"]=> array(4) { [0]=> string(20) "Actualité numéro 1" [1]=> string(20) "Actualité numéro 2" [2]=> string(20) "Actualité numéro 3" [3]=> string(20) "Actualité numéro 4" } } object(SimpleXMLElement)#10 (2) { ["@attributes"]=> array(1) { ["name"]=> string(8) "Novembre" } ["actu"]=> array(4) { [0]=> string(20) "Actualité numéro 1" [1]=> string(20) "Actualité numéro 2" [2]=> string(20) "Actualité numéro 3" [3]=> string(20) "Actualité numéro 4" } }


 
Finalement je m'en suis sorti avec dom, pour la structure que j'ai dans mes xml c'est pas trop compliqué, mais si tu as une idée du problème avec le unset j'aimerais bien comprendre (j'ai passé quasi l'apres midi en conjectures diverses  :lol: )
 
Et quand je dit "ca ne marche pas" c'est pas tres explicite je te l'accordes !
En gros ca ne fait strictement rien, ni erreur de compilo ni écriture dans le fichier...
j'ai testé en local avec wamp, et en ligne sur mon serv, rien a faire.

Reply

Marsh Posté le 23-09-2007 à 10:29:07    

Je ne connais pas très bien simplexml, mais il semblerait qu'$xml->date soit un objet et non un tableau d'objets. (Donc le bazar utilise probablement une interface genre ArrayAccess de la SPL pour pouvoir accéder comme ça aux éléments... auquel cas unset n'est pas censé marcher a priori.)
 
De toute façon je ne crois pas que simplexml gère la suppression d'éléments, donc t'es bien mieux avec DOM pour faire des trucs de ce genre.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 23-09-2007 à 12:33:14    

Et si tu mettais :
 

Code :
  1. $xml=simplexml_load_file("actus.xml" );
  2. if(isset($_POST["date"])){
  3. foreach($_POST["date"] as $val){
  4. echo $val;
  5. unset($xml->date[intval($val)]);
  6. }
  7. $xml->asXML('actus2.xml');
  8. }


 
$xml->date[0] c'est différent de $xml->date['0']. Dans le premier cas c'est l'index 0 du tableau (entier), dans l'autre c'est l'index '0' (string).

Reply

Marsh Posté le 23-09-2007 à 13:49:48    

Normalement $array[0] et $array['0'] reviennent au même en PHP.
 

Code :
  1. $foo = array('bar');
  2. echo $foo[0], ' == ', $foo['0'];


 
affiche 'bar == bar'.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 23-09-2007 à 15:49:35    

Effectivement :jap:

Reply

Marsh Posté le 23-09-2007 à 17:05:31    

merci à vous deux.
Je n'ai pas testé la solution de vanadium car j'ai completement basculé en dom, et ca marche tres bien.
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed