2010-04-20 5 views
2

Quand je lance ce code:PHP: SimpleXML et tableaux

foreach($xml->movie as $movie) { 
    if(isset($movie->photos)) { 
     foreach ($movie->photos as $photo) { 
      echo $photo." "; 
     } 
     echo "<hr/>"; 
    } 
} 

je reçois la sortie belle des données réelles, par exemple une rangée ressemble

06397001.jpg 06397002.jpg 06397003.jpg 06397004.jpg 06397005.jpg

Mais quand je jette dans un tableau, il comprend toutes les balises wrapper SimpleXML et les jpgs ne sont pas à la racine du tableau.

Code

:

foreach($xml->movie as $movie) { 
    if(isset($movie->photos)) { 
     $photos = array(); 
      foreach ($movie->photos as $photo) { 
       $photos[] = $photo; 
      } 
    } else $photos = ""; 
    var_dump($photos); 
    echo "<hr />"; 
} 

par exemple, même ligne ressemble

array(5) { 
    [0]=> object(SimpleXMLElement)#11 (1) { 
     [0]=> string(12) "06397001.jpg" 
    } 
    [1]=> object(SimpleXMLElement)#12 (1) { 
     [0]=> string(12) "06397002.jpg" 
    } 
    [2]=> object(SimpleXMLElement)#13 (1) { 
     [0]=> string(12) "06397003.jpg" 
    } 
    [3]=> object(SimpleXMLElement)#14 (1) { 
     [0]=> string(12) "06397004.jpg" 
    } 
    [4]=> object(SimpleXMLElement)#15 (1) { 
     [0]=> string(12) "06397005.jpg" 
    } 
} 

Pourquoi cela se produit/comment puis-je supprimer ce si je reçois juste un tableau de photos au niveau de la racine comme quand je l'écho?

Répondre

4

Les résultats de SimpleXMLElement ressemblent à des objets et des tableaux simples, mais font des choses magiques que les objets et les tableaux normaux ne peuvent pas faire. Il est conçu de cette façon afin que vous puissiez utiliser moins de code.

Vous pouvez probablement résoudre votre problème avec quelque chose comme:

foreach($xml->movie as $movie) { 
    if(isset($movie->photos)) { 
    $photos = array(); 
    foreach ($movie->photos as $photo) { 
     $photos[] = "$photo"; 
     // or you could use, I believe: $photos[] = $photo[0] 
    } 
    } 
    else $photos = ""; 
    var_dump($photos); echo "<hr />"; 
} 

Pourquoi est-ce qui se passe? Parce qu'un élément SimpleXML traité comme une chaîne se comporte comme s'il s'agissait d'une chaîne, la valeur étant le contenu du texte de cet élément. Dans votre premier exemple, l'utilisation de l'écho traitait l'élément sous la forme d'une chaîne de caractères.

+1

parfait - merci pour la grande explication! – acemasta

+0

Je crois que cela a fonctionné alors? – thomasrutter

+0

Je me demandais cela aussi, merci pour l'info! – mdgrech

0

Je sais que cette question est très ancienne et il a déjà été répondu, mais depuis que j'ai eu ce problème aujourd'hui et j'ai trouvé une solution relativement meilleure et simpliste qui n'implique pas des tonnes de boucles, je veux partager avec vous . Tout d'abord, compte tenu de votre structure xml et du fait que vous n'avez pas besoin des informations du film, vous n'avez pas besoin de les parcourir, mais de rassembler toutes les photos, et cela uniquement via xpath.

si vous avez plusieurs films

$photos = $xml->xpath('//movie//photos'); // double slash means get all elements with that tag name. 

En d'autres termes obtenir toutes les photos de tous les films. Ce code vous donnera un tableau de SimpleXMLElements qui est un tableau avec la clé [0] et la valeur du nom de l'image. Afin d'obtenir le nom de l'image sans boucler juste pour l'obtenir comme une chaîne, vous pouvez simplement transformer cet élément en une chaîne et il sera sorti en tant que chaîne, au lieu de SimpleXMLElement!

La seule boucle que vous pourriez avoir besoin est maintenant:

foreach($photos as $photo) { 
    dump((string) $photo); // this will output the image name as a string e.g. "06397002.jpg" 
} 

Cheers, j'espère que cela aide quelqu'un qui en a besoin