【问题标题】:foreach and simplexmlforeach 和 simplexml
【发布时间】:2025-12-10 02:15:02
【问题描述】:

这是我的 xml 文件:

<?xml version="1.0" encoding="utf-8" ?> 
<documentElement>
    <rows>
        <row>
            <column>1</column>
            <column>David</column>
            <column>Johnson</column>
        </row>
        <row>
            <column>2</column>
            <column>Jack</column>
            <column>Nixon</column>
        </row>
    </rows>
</documentElement>

我想遍历行并将它们添加到数组中。我将它传递给simplexml,然后循环遍历这些对象,但做不到:

$xml->rows
$xml->rows->row
$xml->row
$xml->column

我该怎么办?

谢谢。

【问题讨论】:

    标签: php xml simplexml


    【解决方案1】:

    这实际上是更基本的示例之一:

    $sxml = simplexml_load_string($xml);
    
    foreach($sxml->rows->row as $name => $row)
    {
        echo $name, ': ', var_dump($row);
    }
    

    这将为您提供以下输出:

    row: object(SimpleXMLElement)#3 (1) {
      ["column"]=>
      array(3) {
        [0]=>
        string(1) "1"
        [1]=>
        string(5) "David"
        [2]=>
        string(7) "Johnson"
      }
    }
    row: object(SimpleXMLElement)#5 (1) {
      ["column"]=>
      array(3) {
        [0]=>
        string(1) "2"
        [1]=>
        string(4) "Jack"
        [2]=>
        string(5) "Nixon"
      }
    

    您可以在这里找到在线演示:http://codepad.org/CYyQhvnM

    您实际上应该看看手册中的简单示例部分,它有一些非常有见地的示例,这些示例比我的解释更深入:

    无论如何,我希望答案是有帮助的。相关问题是:

    【讨论】:

      【解决方案2】:

      如果您更习惯于数组,您也可以将简单的 xml 转换为数组:s

      <?php
      $xml = simplexml_load_file('./your.xml');
      $json = json_encode($xml);
      $array = json_decode($json,TRUE);
      print_r($array);
      /**
       *Array
      (
          [rows] => Array
              (
                  [row] => Array
                      (
                          [0] => Array
                              (
                                  [column] => Array
                                      (
                                          [0] => 1
                                          [1] => David
                                          [2] => Johnson
                                      )
      
                              )
      
                          [1] => Array
                              (
                                  [column] => Array
                                      (
                                          [0] => 2
                                          [1] => Jack
                                          [2] => Nixon
                                      )
      
                              )
      
                      )
      
              )
      
      )
       */
      
      foreach($array['rows']['row'] as $row){
          echo 'Id:'.$row['column'][0],
               ' Firstname:'.$row['column'][1],
               ' Lastname:'.$row['column'][2].'<br />'.PHP_EOL;
      }
      
      /*Result
      Id:1 Firstname:David Lastname:Johnson<br />
      Id:2 Firstname:Jack Lastname:Nixon<br />
      */
      ?>
      

      或者是 hakra 的一个更简洁的例子

      <?php
      $xml = simplexml_load_file('./test.xml');
      $rows = json_decode(json_encode(iterator_to_array($xml->rows->row, 0)), 1);
      print_r($rows);
      /**
       *
      Array
      (
          [0] => Array
              (
                  [column] => Array
                      (
                          [0] => 1
                          [1] => David
                          [2] => Johnson
                      )
      
              )
      
          [1] => Array
              (
                  [column] => Array
                      (
                          [0] => 2
                          [1] => Jack
                          [2] => Nixon
                      )
      
              )
      
      )
       */
      
      foreach($rows as $row){
          echo 'Id:'.$row['column'][0],
               ' Firstname:'.$row['column'][1],
               ' Lastname:'.$row['column'][2].'<br />'.PHP_EOL;
      }
      

      【讨论】:

      • 很好,我在iterator_to_array()之前没见过这个功能
      • 是的,它很方便,但要注意第二个键参数:)
      【解决方案3】:

      试试$xml-&gt;rows[0]-&gt;row[0]

      【讨论】:

      • 不,它没有用。它只是返回第一行。不是所有的(所以我不能遍历它们)
      【解决方案4】:

      如果你只是想遍历行:

      <?php
      
      $xmlstr = <<<XML
      <?xml version="1.0" encoding="utf-8" ?> 
      <documentElement>
          <rows>
              <row>
                  <column>1</column>
                  <column>David</column>
                  <column>Johnson</column>
              </row>
              <row>
                  <column>2</column>
                  <column>Jack</column>
                  <column>Nixon</column>
              </row> 
          </rows>
      </documentElement>
      XML;
      
      $element = new SimpleXMLElement($xmlstr);
      
      foreach($element->rows->row as $row) {
      
          foreach($row as $column) {
              echo "{$column}<br>";                
          }
      
          echo "<hr>";
      }
      
      ?>
      

      【讨论】:

      • ...如果您从文件加载 xml,显然使用 simplexml_load_file()
      【解决方案5】:
      $sxml = simplexml_load_string($xml);
      $newArray = array();
      foreach($sxml->rows as $num => $row){
          foreach($row as $el){
              (array)$newArray[] = (array)$el;
          }
      }
      
      var_dump($newArray);
      

      【讨论】: