[SimpleXML] Modification du contenu

Modification du contenu [SimpleXML] - PHP - Programmation

Marsh Posté le 29-03-2011 à 21:15:46    

Bonjour
 
Je suis en train de faire un microsystème de gestion de proxy
Voici un extrait du code

Code :
  1. $pxml = simplexml_load_file( "proxys.xml" );
  2. $proxys_tmp = array();
  3. for ($i = 0; $i < $pxml->proxy->count(); $i++) {
  4.         $proxys_tmp[$i] = $pxml->proxy[$i];
  5. }
  6. // Calculs me permettant de modifier les données de  $proxys_tmp
  7. for ($i = 0; $i < $pxml->proxy->count(); $i++) {
  8.         $pxml->proxy[$i] = $proxys_tmp[$i];
  9.         echo  $pxml->proxy[$i]['ip'].' - '.$proxys_tmp[$i]['ip'].'<br/>';
  10.     }


 
Etrangement, les lignes qui apparaissent comportent deux ips différentes ...
 
Pourriez-vous m'expliquer le problème et m'aider à le résoudre ?
 
NC

Reply

Marsh Posté le 29-03-2011 à 21:15:46   

Reply

Marsh Posté le 30-03-2011 à 17:14:15    

Salut,
 
Tu pourrais montrer la structure de ton XML ? Histoire de pouvoir reproduire ton problème ?

Reply

Marsh Posté le 30-03-2011 à 17:47:35    

Voila un code source permettant de reproduire l'erreur
 

Code :
  1. <?php
  2. $data = '<?xml version="1.0"?>
  3. <proxys nb="3">
  4.     <proxy ip="1.2.3.4" data="abc"></proxy>
  5.     <proxy ip="5.6.7.8" data="def"></proxy>
  6.     <proxy ip="9.10.11.12" data="ghi"></proxy>
  7. </proxys>
  8. ';
  9. $pxml = simplexml_load_string($data);
  10. $proxys_tmp = array();
  11. for ($i = 0; $i < $pxml->proxy->count(); $i++) {
  12.     $proxys_tmp[$i] = $pxml->proxy[$i];
  13. }
  14. $clefs = array();
  15. for ($i = 0; $i < $pxml->proxy->count(); $i++) {
  16.     $clefs[$i] = rand();
  17. }
  18. array_multisort($clefs, SORT_DESC, $proxys_tmp);
  19. for ($i = 0; $i < $pxml->proxy->count(); $i++) {
  20.     $pxml->proxy[$i] = $proxys_tmp[$i];
  21.     echo $pxml->proxy[$i]['ip'] . ' - ' . $proxys_tmp[$i]['ip'] . '<br/>';
  22. }
  23. ?>


Message édité par nisalon_caje le 30-03-2011 à 17:48:23

---------------
http://nisalon.labrute.com/
Reply

Marsh Posté le 30-03-2011 à 17:58:25    

Voici ce que je fais en reprenant ton xml, et qui fonctionne très bien :

Code :
  1. $pxml = simplexml_load_string($data);
  2. $proxys_tmp = array();
  3. foreach ($pxml->proxy as $k => $p){
  4. $proxys_tmp[] = $p->attributes();
  5. }
  6. for ($i = 0; $i < $pxml->proxy->count(); $i++) {
  7. $pxml->proxy[$i] = $proxys_tmp[$i];
  8. echo $pxml->proxy[$i]['ip'] . ' - ' . $proxys_tmp[$i]['ip'] . '<br/>';
  9. }


Il semblerait que ce soit ton array_multisort qui casse tout... Surtout si tu le bases sur un random...
Pour rappel, ca agit par référence sur ta variable $proxys_tmp...


Message édité par the_bigboo le 30-03-2011 à 17:58:57
Reply

Marsh Posté le 30-03-2011 à 20:21:20    

A vrai dire il y a deux choses que je n'ai pas compris :  
- J'ai mis le random pour mettre une valeur aléatoire pour le tri, j'aurais aussi bien pu mettre le résultat d'un calcul basé sur data
- je n'ai pas compris de plus en quoi le fait que l'on agisse par référence sur $proxys_tmp changeait quelque chose
- dans votre exemple, il n'y a pas d'array multisort, il rend effectivement le même résultat, mais rien n'a été changé :p (et en réintroduisant l'array multisort, je n'ai pas le résultat escompté) :(


---------------
http://nisalon.labrute.com/
Reply

Marsh Posté le 30-03-2011 à 21:16:03    

En fait, d'après ton post, j'avais compris que tu voulais avoir les mêmes valeurs. Pourrais tu m'expliquer ce que tu cherches à faire ? Et me donner le résultat que tu cherches à obtenir à partix du XML d'exemple ?

Reply

Marsh Posté le 30-03-2011 à 21:53:07    

pas de soucis
Je cherche juste à classer mes proxys selon les valeurs qui sont dans $clefs, de manière décroissante. (là j'ai mis une valeur aléatoire, afin que l'on puisse tester, dans le cas réel ca fait appel à une fonction relativement compliquée)

 

ainsi, mon array multisort trie bien $proxys_tmp, mais c'est lors de la recopie que les choses se passent mal : alors que le echo de la ligne 10 devrait afficher 2 fois la même valeur (puisque la recopie de la valeur est en ligne 9), la recopie ne s'effectue pas


Message édité par nisalon_caje le 30-03-2011 à 22:05:05

---------------
http://nisalon.labrute.com/
Reply

Sujets relatifs:

Leave a Replay

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