Вы могли бы немного переосмыслить свою логику.Приведенный ниже фрагмент создает массив $book
для каждого элемента <book>
, начиная каждый раз со значений по умолчанию (пустая строка) в случае, если <name>
или <info>
не существует для книги.
При достижении <name>
и <info>
элементов их содержимое добавляется в текущий массив $book
.
При достижении </book>
массив $book
добавляется в основной массив$books
.
Здание $books
function parseXML($args){
extract($args);
$xml = new XMLReader();
$xml->open($file) or die('Cannot open file');
$books = array();
while ($xml->read()) {
// <book> - start a new child array with default values
if ($xml->nodeType === XMLReader::ELEMENT
&& $xml->localName === 'book') {
$book = array_fill_keys($nodes, '');
// </book> - add the child array to main array
} elseif ($xml->nodeType === XMLReader::END_ELEMENT
&& $xml->localName === 'book') {
$books[] = $book;
// <info> or <title> - add to child array
} elseif ($xml->nodeType === XMLReader::ELEMENT
&& in_array($xml->localName, $nodes, TRUE)) {
$name = $xml->localName;
$val = $xml->readString();
$book[$name] = trim($val);
}
}
$xml->close();
return $books;
}
Результирующий массив
$books = array(
array('title' => 'book 1', 'info' => 'book 1 info'),
array('title' => 'book 2', 'info' => ''),
array('title' => 'book 3', 'info' => 'book 3 info'),
);