PHP,SimpleXML数组。意外将数组转换为字符串

时间:2010-10-03 05:05:40

标签: php arrays simplexml

示例XML:

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

以下代码是我的小应用程序的基础,它可以正常工作:

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

下一个代码,我通常认为是等效的。我不明白为什么:

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

我的感觉是,赋值运算符将simplexml对象(rating对象)的数组转换为奇怪的东西,但不知道如何。

其他一些小提示:

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

2 个答案:

答案 0 :(得分:0)

您的echo不一样:

echo($rating."::"); 

应该是

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

答案 1 :(得分:0)

好的,清理一些自己的工作。在尝试更多地简化我的问题之后,我无法证明这一点。在搞乱了实际的代码之后,我认为这意味着我在我的应用程序的其他地方有一些变异对象,它会在这个xml解析中变得疯狂并产生奇怪的结果。对于困惑和不必要的问题感到抱歉(我猜这证明了为什么我试图通过这个应用程序重构我的一些复杂性。)

作为一个离别礼物,这里是我使用的代码测试套件(从简单到更现实),我曾经证明所有代码都像宣传的一样:

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

?>