views:

44

answers:

2

Sample XML:

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

The following code is the basis for my small application, it works as would be expected:

<?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
}
?>

This next code, which I would normally consider to be equivalent is not. And I have no idea why:

<?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...... */
  }
?>

My feeling is that the assignment operator is casting the array of simplexml objects (ratings objects) as something odd, but have no clue as to how.

Any ideas?

Other little hints:

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"
}
*/
A: 

Your echos are not the same:

echo($rating."::"); 

should be

echo($rating->value."::");
codaddict
screwed up the first code snippet while revising the problem. Ratings is the only element (aka, no value sub-element), so the second syntax ($rating) or ($xml->ratings) is correct....
J Jones
A: 

Ok, cleaning up some of my own work. After attempting to simplify my issue more, I was not able to prove it. After messing with the actual code, I assume this means I have some sort of mutating object elsewhere in my app that is going bonkers and creating weird results in this xml parsing. Sorry for the confusion and needless question (I guess this proves why i'm trying to refactor some of my complexity out of this app).

As a parting gift, here is the test-suite of code that I used (from simple to more realistic) that I used to prove that all worked as advertised:

<?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."::");
}

?>
J Jones