У меня есть 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 ) )