Ребята, путаюсь во вложенности тегов. нужно получить информацию следующим образом id, name, pmboxtype, делать пытаюсь след. образом PHP: while ($reader->read()) { if (($reader->nodeType == XMLReader::ELEMENT) && ($reader->localName == 'PMActivity')) { $xmlarr = array(); // считываем атрибуты $xmlarr['id'] = $reader->getAttribute('id'); $xmlarr['name'] = $reader->getAttribute('Name'); var_dump($xmlarr['id'], $xmlarr['name']); while ($reader->read()) { if (($reader->nodeType == XMLReader::ELEMENT) && ($reader->localName == 'PMActivityProps')) { while ($reader->read()) { if (($reader->nodeType == XMLReader::ELEMENT) && ($reader->localName == 'PMBoxType')) { while ($reader->read()) { if ($reader->nodeType == XMLReader::TEXT) { $xmlarr[$reader->localName] = $reader->value; var_dump ($xmlarr[$reader->localName] = $reader->value); echo '<br>'; } elseif (($reader->nodeType == XMLReader::END_ELEMENT) && ($reader->localName == 'PMBoxType')) { break; } } } } } } } elseif (($reader->nodeType == XMLReader::END_ELEMENT) && ($reader->localName == 'PMActivityProps')) { break; } } информация получаю такую что одна строка получается как надо, а далее только pmboxtype, понимаю что с циклами проблема, а разобраться не получается
Основные ошибки следующие: 1. Нет условия выхода из внутреннего цикла. 2. Значения массива будут перезаписываться, после выхода из циклов он будет содержать только последние значения. В вашем случае можно сделать примерно так, хотя безусловно существуют лучшие варианты PHP: $ids = $names = $box_types = []; while($z->read()) { while($z->read() && $z->name !== 'PMActivity') {}; array_push($ids, $z->getAttribute('id')); array_push($names, $z->getAttribute('name')); while($z->read() && $z->name !== 'PMActivityProps') {}; while($z->read() && $z->name !== 'PMBoxType') {}; while($z->read() && $z->nodeType !== XMLReader::TEXT) {}; array_push($box_types, $z->value); }