了解PHP中SimpleXMLElement对象的形成

时间:2018-07-23 09:39:42

标签: php foreach simplexml

我很想知道PHP是如何从XML文档中形成SimpleXMLElement对象的,但是我认为在此过程中可能有些未知的事情。

当我们遍历PHP中的对象时,将遍历公共属性。因此,如果第一个属性是一个数组,则我们应该在第一个循环内需要另一个循环来对其进行迭代,但是,对于SimpleXMLElement对象似乎并非如此。例如看这个对象:

  object(SimpleXMLElement)#1 (1) {
  ["user"]=>
  array(5) {
    [0]=>
    object(SimpleXMLElement)#2 (3) {
      ["firstname"]=>
      string(6) "Sheila"
      ["surname"]=>
      string(5) "Green"
      ["contact"]=>
      object(SimpleXMLElement)#7 (3) {
        ["phone"]=>
        string(9) "1234 1234"
        ["url"]=>
        string(18) "http://example.com"
        ["email"]=>
        string(18) "pamela@example.com"
      }
    }
    [1]=>
    object(SimpleXMLElement)#3 (3) {
      ["firstname"]=>
      string(5) "Bruce"
      ["surname"]=>
      string(5) "Smith"
      .
      .
      .

它包含一个“用户”属性,其中有一个数组(包含5个元素)。因此,当我们遍历此对象时,应该得到以下错误:

  

注意:...中的数组到字符串的转换

我已经在以下代码段中对此进行了测试:

$var = (object)array(
   'user'=>['joe','mia'],
);

现在此循环给出了我上面刚刚提到的错误:

foreach ($test as $property => $val){
    echo $property.':'.$val.'<br>';
}

2 个答案:

答案 0 :(得分:1)

循环中的

$val是一个数组,因此无法回显它。使用print_r($val)来显示其值。

foreach ($test as $property => $val){
    echo $property.':';
    print_r($val);
    echo '<br>';
}

答案 1 :(得分:1)

值得了解基本的SimpleXML处理是如何工作的,尝试破解对象的内部结构不会有帮助。尝试访问元素时,请使用->elementName

您可能拥有的数据的简单模拟...

$data = "<base>
    <user>
        <firstname>Sheila</firstname>
        <surname>Green</surname>
        <contact>
            <phone>1234 1234</phone>
        </contact>
    </user>
</base>";

如果要打印出<user>下的所有元素,则可以使用foreach()并使用->user->children(),如...

$xml = simplexml_load_string($data);
//print_r($xml);

foreach ( $xml->user->children() as $tag => $value )  {
    echo $tag."-".$value.PHP_EOL;
}

哪个输出...

firstname-Sheila
surname-Green
contact-

由于联系本身就是一种结构,因此您可以添加

if ( $value->count() > 0 )  {
    foreach ( $value->children() as $tag => $sub )  {
        echo $tag."-".$sub.PHP_EOL;
    }
}

允许您打印出来。