Атрибуты SimpleXML для массива

Есть ли более элегантный способ избежать атрибутов 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') .... }