2010-10-03 9 views
2

XML Exemple:PHP, tableaux SimpleXML. coulée non anticipée d'un tableau à une chaîne

<root> 
    <ratings>3</ratings> 
    <ratings>5</ratings> 
    <ratings>7</ratings> 
</root> 

Le code suivant est la base de ma petite application, cela fonctionne comme on pouvait s'y attendre:

<?php 
    // $xml is some simplexml object 
    sizeof($xml->ratings); //3 
    foreach($xml->ratings as $rating){ 
     echo($rating->value."::"); //this echoes all 3 rating values: 3::5::7 
} 
?> 

Ce code suivant, qui Je considérerais normalement être équivalent n'est pas. Et je ne sais pas pourquoi:

<?php 
    // $xml is some simplexml object 
    $ratings = $xml->ratings; 
    sizeof($ratings); //3, all is well so far 
    foreach($ratings as $rating){ 
     echo($rating."::"); 
    /*this echoes a never-ending list of ratings, 
    looking like 3::5::5::5::5::5::5::5...... */ 
    } 
?> 

Mon sentiment est que l'opérateur d'affectation est coulée le tableau d'objets SimpleXML (objets de notation) comme quelque chose de bizarre, mais ils ont pas la moindre idée de comment.

Autres petits conseils:

var_dump($xml); 
/* Output is: 
object(SimpleXMLElement)#7 (1) { 
    ["ratings"]=> 
    array(3) { 
    [0]=> 
    string(1) "3" 
    [1]=> 
    string(1) "5" 
    [2]=> 
    string(1) "7" 
    } 
} 
*/ 
var_dump($ratings); 
/* Output is: 
object(SimpleXMLElement)#6 (1) { 
    [0]=> 
    string(1) "3" 
} 
*/ 

Répondre

0

Votre echo s ne sont pas les mêmes:

echo($rating."::"); 

devrait être

echo($rating->value."::"); 
+0

foiré le premier extrait de code tout en révisant le problème. Ratings est le seul élément (aka, aucun sous-élément de valeur), donc la deuxième syntaxe ($ rating) ou ($ xml-> ratings) est correcte .... –

0

Ok, nettoyage une partie de mon propre travail. Après avoir tenté de simplifier davantage mon problème, je n'ai pas été capable de le prouver. Après avoir joué avec le code réel, je suppose que cela signifie que j'ai une sorte d'objet de mutation ailleurs dans mon application qui va bonkers et de créer des résultats bizarres dans cette analyse XML. Désolé pour la confusion et la question inutile (je suppose que cela prouve pourquoi j'essaie de refactoriser une partie de ma complexité de cette application).

Comme cadeau d'adieu, voici la suite de test de code qui je (du simple à plus réaliste) que je l'habitude de prouver que tous travaillé comme annoncé:

<?php 
$string = <<<XML 
<?xml version='1.0'?> 
<root> 
<ratings>3</ratings> 
<ratings>5</ratings> 
<ratings>7</ratings> 
</root> 
XML; 
$xml = simplexml_load_string($string); 
var_dump($xml); 

echo("Size:".sizeof($xml->ratings)."\n"); 
foreach($xml->ratings as $rating){ 
echo($rating."::"); 
} 
echo("\n"."------"."\n"); 

$ratings = $xml->ratings; 

echo("Size:".sizeof($ratings)."\n"); 
foreach($ratings as $rating){ 
echo($rating."::"); 
} 

echo("\n\n\n\n"."||||New Example||||"."\n\n\n\n"); 

$stringthree = <<<XML 
<root attr1="val" attr2="desc"> 
     <field-one>val</field-one> 
     <elm-two attr-name="foo">elmTwoVal1</elm-two> 
     <elm-three>elmThreeVal1</elm-three> 
     <elm-two attr-name="bar">elmTwoVal2</elm-two> 
     <elm-three>elmThreeVa2</elm-three> 
     <elm-two attr-name="bear">elmTwoVal3</elm-two> 
     <elm-three>elmThreeVal3</elm-three> 
</root> 
XML; 

$xmlthree = simplexml_load_string($stringthree); 

var_dump($xmlthree); 
echo("Size:".sizeof($xmlthree->{'elm-two'})."\n"); 
foreach($xmlthree->{'elm-two'} as $elm){ 
echo($elm."::"); 
} 
echo("\n"."------"."\n"); 

$elmMain = $xmlthree->{'elm-two'}; 
echo("Size:".sizeof($elmMain)."\n"); 
foreach($elmMain as $elm){ 
echo($elm."::"); 
} 

?>