Преобразование 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;
}