Написать цикл foreach для массива SimpleXMLElements - PullRequest
2 голосов
/ 18 апреля 2010

Я использую XPath в PHP 5 для разбора XML-документа. У меня проблема в записи foreach для правильного отображения следующего массива:

Пример XML-документа

значение 1 значение 2

           $xmlfile = 'link_to_file.xml';                       
            $xmlRaw = file_get_contents($xmlfile);      
            $xml = new SimpleXMLElement($xmlRaw);
            $install_files = $xml->xpath('//files');
            foreach($install_files as $row)
            {
              echo $row['file'];
            }

// var_dump для $ row дает следующее

               array(1) {
                  [0]=>
                  object(SimpleXMLElement)#21 (2) {
                    ["file"]=>
                    string(12) "value 1"
                    ["folder"]=>
                    string(8) "value 2"
                  }
                }

В идеале я хотел бы получить значение с помощью $row['file'] или $row['folder']. Спасибо за любую помощь.

Ответы [ 3 ]

2 голосов
/ 18 апреля 2010

Элементы в вашем массиве: SimpleXMLElement объекты. Вы можете получить доступ к свойствам с синтаксисом $object->property. Итак, попробуйте это:

foreach ($array as $row) {
    echo $row->folder . $row->file;
}
0 голосов
/ 18 апреля 2010

Если вы хотите обработать только один элемент, вам не обязательно нужен цикл, но он также не повредит.
Согласно вашему выводу file и folder являются дочерними элементами возвращаемого элементадля вашего запроса xpath.Вы можете получить к ним доступ через $parentElement->childElement.Если бы они были атрибутами, вы бы использовали $element['attributeName']

$foo = new SimpleXMLElement(getData());

foreach( $foo->xpath('row[@id="r2"]') as $row ) {
  echo $row->file, " | ", $row->folder, "\n";
}
echo "-----\n";

// same thing if you have more than one element in your result set
foreach( $foo->xpath('row[@id="r2" or @id="r3"]') as $row ) {
  echo $row->file, " | ", $row->folder, "\n";
}

function getData() {
  return '<foo>
    <row id="r1">
      <file>value 1.1</file>
      <folder>value 1.2</folder>
    </row>
    <row id="r2">
      <file>value 2.1</file>
      <folder>value 2.2</folder>
    </row>
    <row id="r3">
      <file>value 3.1</file>
      <folder>value 3.2</folder>
    </row>
  </foo>';
}

print

value 2.1 | value 2.2
-----
value 2.1 | value 2.2
value 3.1 | value 3.2
0 голосов
/ 18 апреля 2010

Если я правильно понимаю ваш пример,

foreach ($array as $row)
{
    // do something with $row['file'] or $row['folder']
}
...