开发者

PHP, SimpleXML arrays. Unanticipated casting of an array to a string

开发者 https://www.devze.com 2023-01-18 18:12 出处:网络
Sample XML: <root> <ratings>3</ratings> <ratings>5</ratings> <ratings>7</ratings>

Sample XML:

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

The following code is the b开发者_StackOverflow中文版asis 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.

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


Your echos are not the same:

echo($rating."::"); 

should be

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


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

?>
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号