Преобразование XML в массив или объект

print_r(xml_decode('<?xml version="1.0" encoding="windows-1251" standalone="yes"?>
<order_response>
    <id>1043690</id>
    <ticket>kYQGKxcj000001043690OCrjirAQCIpmPKfmpKzV</ticket>
    <ok_code>wadlacURJa</ok_code>
    <failure_code>flxrqhVvdm</failure_code>
    <response_code>0</response_code>
    <response_message>Успешное выполнение запроса</response_message>
</order_response>'));

function xml_decode($xml){
$dom = new DOMDocument('1.0', 'utf-8');
@$dom->loadXML($xml);
if(!$dom)die('Файл XML испорчен!');
$root=$dom->documentElement;
$nodelist=$root->childNodes;    //список узлов 1-го уровня
$res=[];
foreach ($nodelist as $child) {
    if ($child->nodeType==XML_ELEMENT_NODE){
    $res[$child->nodeName]=$child->nodeValue;
    foreach ($child->childNodes as $child2)
        if ($child2->nodeType==XML_ELEMENT_NODE){
       $res[$child2->nodeName]=$child2->nodeValue;
        }
    }
}
return (object)$res; // этот вариант вернет в виде объекта
//return $res; // этот вариант вернет в виде массива
}

Здесь собраны различные варианты ыфункция преобразования xml структуры в массив

$xml = simplexml_load_string('<?xml version="1.0" encoding="utf-8"?>
<d:multistatus xmlns:d="DAV:"><d:response><d:href>/backup/</d:href>
<d:propstat><d:status>HTTP/1.1 200 OK</d:status>
<d:prop>
<d:resourcetype><d:collection/></d:resourcetype>
<d:getlastmodified>Fri, 26 Sep 2014 20:37:12 GMT</d:getlastmodified>
<d:displayname>backup</d:displayname><d:creationdate>2014-09-26T20:37:12Z</d:creationdate>
</d:prop>
</d:propstat></d:response><d:response><d:href>/backup/pngcrush.zip</d:href>
<d:propstat><d:status>HTTP/1.1 200 OK</d:status><d:prop><d:resourcetype/>
<d:getlastmodified>Fri, 26 Sep 2014 21:26:39 GMT</d:getlastmodified>
<d:getetag>6af2c93801e3ca8a3eb7e00a9763945b</d:getetag>
<d:getcontenttype>application/x-zip-compressed</d:getcontenttype>
<d:getcontentlength>139608</d:getcontentlength>
<d:displayname>pngcrush.zip</d:displayname><d:creationdate>2014-09-26T21:26:39Z</d:creationdate></d:prop>
</d:propstat></d:response></d:multistatus>');//, 'SimpleXMLElement', LIBXML_NOCDATA);
var_dump(xml2array($xml));

function xml2array($data) {
    if (is_object($data)) $data = get_object_vars($data);
    return (is_array($data)) ? array_map(__FUNCTION__,$data) : $data;
}
function xml2array($arrObjData, $arrSkipIndices = [])
{
    $arrData = [];
    // 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 = xml2array($value, $arrSkipIndices); // recursive call
            }
            if (in_array($index, $arrSkipIndices)) {
                continue;
            }
            $arrData[$index] = $value;
        }
    }
    return $arrData;
}
function xml2array($xml)
{
    $arr = [];

    foreach ($xml->children() as $r)
    {
        $t = [];
        if(count($r->children()) == 0)
        {
            $arr[$r->getName()] = strval($r);
        }
        else
        {
            $arr[$r->getName()][] = xml2array($r);
        }
    }
    return $arr;
}
function xml2array( $xmlObject, $out = array () )
{
    foreach ( (array) $xmlObject as $index => $node )
    {
        $out[$index] = ( is_object ( $node ) ) ? xml2array ( $node ) : $node;
    }
    return $out;
}
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;
}