XML-массив?

Ну, у меня возникли проблемы с изменением xml в массив … Было бы просто, если бы каждый xml выполнял один и тот же формат, но каждый XML отличается, за исключением <Formula> , formulaname и movepeed ex:

 <Formula> <formulaname>Basic</formulaname> <movespeed>1</movespeed> <str>4</str> <dex>3</dex> <int>1</int> <will>2</will> </Formula> 

или

 <Formula> <formulaname>Basic</formulaname> <movespeed>1</movespeed> <box>4</box> <chicken>3</chicken> <ducks>1</ducks> <cereal>2</cereal> </Formula> 

То, что я пробовал:

 $xml = simplexml_load_file("test.xml"); print_r($xml); 

Это на самом деле prints что-то, но я не мог пройти мимо этого или даже echo его.

 foreach($xml->text as $string) { print_r($string); echo 'attributes: '. $string->attributes() .'<br />'; } 

Не работает, изначально это для strings но ни одна из них не является strings

 foreach ($xml->Formula as $element) { foreach($element as $key => $val) { echo "{$key}: {$val}"; } 

Не работал, мне нужно было что-то вроде этого работать, поэтому я могу использовать значения из array не зная, как именно будет вызываться значение.

Вы не можете получить доступ к детям, используя foreach на самом узле, вам нужно использовать .children() :

 $s =<<<EOS <root> <Formula> <formulaname>Basic</formulaname> <movespeed>1</movespeed> <box>4</box> <chicken>3</chicken> <ducks>1</ducks> <cereal>2</cereal> </Formula> </root> EOS; $xml = simplexml_load_string($s); foreach ($xml->Formula as $element) { foreach($element->children() as $key => $val) { echo "{$key}: {$val}"; } } 

Это ваш лучший выбор, и он должен устранить все объекты SimpleXMLElement и вместо этого дать вам ничего, кроме массивов:

 $xml = simplexml_load_file("test.xml"); $xml_array = unserialize(serialize(json_decode(json_encode((array) $xml), 1))); print_r($xml_array); 

Делает разницу между этим:


Массив с объектами SimpleXMLElement


И это:


Все массивы - без смешивания с объектами SimpleXMLElement


Надеюсь, это поможет… 🙂

для вашего примера этого кода достаточно:

 $xml = simplexml_load_file('formula.xml'); $arr = (array) $xml; var_dump($arr); 

и ваш xml переходит в массив
formula.xml содержит ваш xml

Если у вас есть cdata и атрибуты в одном узле, использование вышеперечисленных методов будет опускать атрибуты.

попробуйте использовать этот метод:

 function xml2array($xmlObject, $out = []) { foreach($xmlObject->attributes() as $attr => $val) $out['@attributes'][$attr] = (string)$val; $has_childs = false; foreach($xmlObject as $index => $node) { $has_childs = true; $out[$index][] = xml2array($node); } if (!$has_childs && $val = (string)$xmlObject) $out['@value'] = $val; foreach ($out as $key => $vals) { if (is_array($vals) && count($vals) === 1 && array_key_exists(0, $vals)) $out[$key] = $vals[0]; } return $out; } $xml = simplexml_load_string($xml_string, 'SimpleXMLElement', LIBXML_NOCDATA); $arr = xml2array($xml);