foreach loop over SimpleXMLElement не работает, только 1 элемент в результате

У меня есть xml-файл с этой структурой:

$xmlString = ' <plist> <categories> <category> <id>1</id> <parent>0</parent> <description><![CDATA[Test 1]]></description> </category> <category> <id>2</id> <parent>1</parent> <description><![CDATA[Test 1.1]]></description> </category> <category> <id>3</id> <parent>1</parent> <description><![CDATA[Test 1.2]]></description> </category> </categories> </plist>'; 

Теперь я пытаюсь построить массив таким образом:

 $xmlData = new SimpleXMLElement($xmlString); $results = []; foreach($xmlData->categories->category as $key => $category){ $results[$key]['id'] = isset($category->id) ? (string)$category->id : false; $results[$key]['parentId'] = isset($category->parent) ? (string)$category->parent : false; $results[$key]['name'] = isset($category->description) ? (string)$category->description : false; } echo '<pre>'.print_r($results,true).'</pre>'; 

Но результатом является только последняя запись:

 Array ( [category] => Array ( [id] => 3 [parentId] => 1 [name] => Test 1.2 ) ) 

Объект SimpleXMLElement выглядит следующим образом:

 SimpleXMLElement Object ( [categories] => SimpleXMLElement Object ( [category] => Array ( [0] => SimpleXMLElement Object ( [id] => 1 [parent] => 0 [description] => SimpleXMLElement Object ( ) ) [1] => SimpleXMLElement Object ( [id] => 2 [parent] => 1 [description] => SimpleXMLElement Object ( ) ) [2] => SimpleXMLElement Object ( [id] => 3 [parent] => 1 [description] => SimpleXMLElement Object ( ) ) ) ) ) 

Итак, категория – это массив, и я не понимаю, почему цикл foreach не работает. Ключ должен быть 1,2,3 или нет?

Замените цикл с этим. $key всегда был одним и тем же ключом. так что каждый раз он переписывался

 $counter=0; foreach($xmlData->categories->category as $category){ $results[$counter]['id'] = isset($category->id) ? (string)$category->id : false; $results[$counter]['parentId'] = isset($category->parent) ? (string)$category->parent : false; $results[$counter]['name'] = isset($category->description) ? (string)$category->description : false; $counter++; } 

Хорошо, вот ответ без счетчиков, но с простым [] :

 foreach($xmlData->categories->category as $category){ $results[] = array( 'id' => isset($category->id) ? (string)$category->id : false, 'parentId' => isset($category->parent) ? (string)$category->parent : false, 'name' => isset($category->description) ? (string)$category->description : false, ); } 

используйте это

 $xmlData = new SimpleXMLElement($xmlString); $results = []; $ii = 0; foreach($xmlData->categories->category as $category){ $results[$ii]['id'] = isset($category->id) ? (string)$category->id : false; $results[$ii]['parentId'] = isset($category->parent) ? (string)$category->parent : false; $results[$ii]['name'] = isset($category->description) ? (string)$category->description : false; $ii++; } echo '<pre>'.print_r($results,true).'</pre>'; 

Использовать это:

 $xmlString = ' <plist> <categories> <category> <id>1</id> <parent>0</parent> <description><![CDATA[Test 1]]></description> </category> <category> <id>2</id> <parent>1</parent> <description><![CDATA[Test 1.1]]></description> </category> <category> <id>3</id> <parent>1</parent> <description><![CDATA[Test 1.2]]></description> </category> </categories> </plist>'; $xml = simplexml_load_string($xmlString, "SimpleXMLElement", LIBXML_NOCDATA | LIBXML_NOWARNING | LIBXML_NOERROR | LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); $json = json_encode($xml); $data = json_decode($json, true); // print_r($data); $result = array(); if(isset($data['categories']['category'])) { foreach($data['categories']['category'] as $array){ // print_r($array); $result[] = $array; } } print_r($result); 

Результат:

 Array ( [0] => Array ( [id] => 1 [parent] => 0 [description] => Test 1 ) [1] => Array ( [id] => 2 [parent] => 1 [description] => Test 1.1 ) [2] => Array ( [id] => 3 [parent] => 1 [description] => Test 1.2 ) )