Есть ли более элегантный способ избежать атрибутов SimpleXML для массива?
$result = $xml->xpath( $xpath ); $element = $result[ 0 ]; $attributes = (array) $element->attributes(); $attributes = $attributes[ '@attributes' ];
Я действительно не хочу, чтобы он проходил через него только для извлечения пары ключ / значение. Все, что мне нужно – это получить его в массив, а затем передать его. Я бы подумал, что attributes()
сделали бы это по умолчанию или, по крайней мере, дали бы опцию. Но я даже не мог найти решение выше, я должен был это выяснить самостоятельно. Я чем-то усложняю это или что-то еще?
Редактировать:
Я все еще использую указанный выше сценарий, пока не узнаю, уверен ли доступ к массиву @attributes или нет.
Не читайте '@attributes'
свойство '@attributes'
, это для внутреннего использования. В любом случае, attributes()
уже могут использоваться как массив без необходимости «конвертировать» в реальный массив.
Например:
<?php $xml = '<xml><test><aa="b" r="x" q="v" /></test><b/></xml>'; $x = new SimpleXMLElement($xml); $attr = $x->test[0]->a[0]->attributes(); echo $attr['a']; // "b"
Если вы хотите, чтобы он был «истинным» массивом, вам нужно зациклиться:
$attrArray = array(); $attr = $x->test[0]->a[0]->attributes(); foreach($attr as $key=>$val){ $attrArray[(string)$key] = (string)$val; }
более элегантный способ; он дает те же результаты без использования $ attributes ['@attributes'] :
$attributes = current($element->attributes());
Вы можете преобразовать весь XML-документ в массив:
$array = json_decode(json_encode((array) simplexml_load_string("<response>{$xml}</response>")), true);
Для получения дополнительной информации см. https://github.com/gaarf/XML-string-to-PHP-array
Я думаю, вам придется пройти. Вы можете получить его в массив после того, как прочитаете xml.
<?php function objectsIntoArray($arrObjData, $arrSkipIndices = array()) { $arrData = array(); // if input is object, convert into array if (is_object($arrObjData)) { $arrObjData = get_object_vars($arrObjData); } if (is_array($arrObjData)) { foreach ($arrObjData as $index => $value) { if (is_object($value) || is_array($value)) { $value = objectsIntoArray($value, $arrSkipIndices); // recursive call } if (in_array($index, $arrSkipIndices)) { continue; } $arrData[$index] = $value; } } return $arrData; } $xmlStr = file_get_contents($xml_file); $xmlObj = simplexml_load_string($xmlStr); $arrXml = objectsIntoArray($xmlObj); foreach($arrXml as $attr) foreach($attr as $key->$val){ if($key == '@attributes') .... }