在PHP中,将对象转换为数组的最快方法是什么?

在PHP中,将对象转换为数组的最快方法是什么?,php,arrays,object,Php,Arrays,Object,目前有很多不同的方法可以使用PHP将多层对象转换为多维数组。有些似乎适得其反,但被广泛使用。我真的想知道哪种方法最快(通常) 我尝试了几种最常用的方法,并对结果进行了计时。我意识到物体的深度会有很大的影响,每个层次上的子物体的数量也会有很大的影响。我很好奇是否有人有他们认为更快的方法。下面是我使用的代码,从中我可以看出这是两种最常见的方法。我需要一些示例数据,所以我从一个示例XML文件中提取了它 <?php $xml = file_get_contents("http://www.w3s

目前有很多不同的方法可以使用PHP将多层对象转换为多维数组。有些似乎适得其反,但被广泛使用。我真的想知道哪种方法最快(通常)

我尝试了几种最常用的方法,并对结果进行了计时。我意识到物体的深度会有很大的影响,每个层次上的子物体的数量也会有很大的影响。我很好奇是否有人有他们认为更快的方法。下面是我使用的代码,从中我可以看出这是两种最常见的方法。我需要一些示例数据,所以我从一个示例XML文件中提取了它

<?php

$xml = file_get_contents("http://www.w3schools.com/xml/cd_catalog.xml");

//load XML string into SimpleXML object
$xmlObj = simplexml_load_string($xml);


/*
    Method 1
    Recursive typecasting
    http://ben.lobaugh.net/blog/567/php-recursively-convert-an-object-to-an-array
*/

function objToArrayRecursiveTypecast($obj)
{
    if(is_object($obj)) $obj = (array) $obj;
    if(is_array($obj)) {
        $new = array();
        foreach($obj as $key => $val) {
            $new[$key] = objToArrayRecursiveTypecast($val);
        }
    }
    else $new = $obj;
    return $new;       
}

$method1StartTime = microtime(true);

$method1Results = objToArrayRecursiveTypecast($xmlObj);

$method1EndTime = microtime(true);
$method1ExecTime = $method1EndTime - $method1StartTime;



/*
    Method 2
    json_encode json_decode
    Appears in code everywhere
*/

$method2StartTime = microtime(true);

$method2Results = json_decode(json_encode($xmlObj), true);

$method2EndTime = microtime(true);
$method2ExecTime = $method2EndTime - $method2StartTime;



/*
    Method 3
    Recursive object read and array assignment
    Answer in http://stackoverflow.com/questions/4345554/convert-php-object-to-associative-array
*/

function object_to_array_recursive( $object, $assoc=TRUE, $empty='' ) 
{ 

    $res_arr = array(); 

    if (!empty($object)) { 

        $arrObj = is_object($object) ? get_object_vars($object) : $object;

        $i=0; 
        foreach ($arrObj as $key => $val) { 
            $akey = ($assoc !== FALSE) ? $key : $i; 
            if (is_array($val) || is_object($val)) { 
                $res_arr[$akey] = (empty($val)) ? $empty : object_to_array_recursive($val); 
            } 
            else { 
                $res_arr[$akey] = (empty($val)) ? $empty : (string)$val; 
            } 

        $i++; 
        }

    } 

    return $res_arr;
}

$method3StartTime = microtime(true);

$method3Results = object_to_array_recursive($xmlObj);

$method3EndTime = microtime(true);
$method3ExecTime = $method3EndTime - $method3StartTime;



/*
    Method 4
    Array map method
    http://stackoverflow.com/questions/2476876/how-do-i-convert-an-object-to-an-array/2476954#2476954
*/

function arrayMapObjectToArray($object)
{
    if(!is_object($object) && !is_array($object))
        return $object;

    return array_map('arrayMapObjectToArray', (array) $object);
}

$method4StartTime = microtime(true);

$method4Results = arrayMapObjectToArray($xmlObj);

$method4EndTime = microtime(true);
$method4ExecTime = $method4EndTime - $method4StartTime;



//output results
echo "Method 1 time to execute: $method1ExecTime \n";
echo "Method 2 time to execute: $method2ExecTime \n";
echo "Method 3 time to execute: $method3ExecTime \n";
echo "Method 4 time to execute: $method4ExecTime \n";


?>
编辑:添加了另一个涉及使用递归类型转换的方法


编辑:添加了数组映射方法。json_encode+json_decode方法的快速性来自这样一个事实,即两个函数都有已经编译的本机实现,因此运行速度远远快于php替代方案所需的解释速度。与阵法施法类似,阵法施法也可以提高速度,但有一个限制,即不能深入一层以上。

此外,对PHP编码函数的每次调用都需要设置PHP堆栈,这比设置本机(C/C++)堆栈更昂贵。


总之,提供object2array()函数的PHP扩展将是最快的扩展,但是我不确定是否存在这样的方法。在找到这样一个方法之前,json函数家族仍然是最快的不幸的是,类型转换只转换多维对象的第一层,但将每个元素保留为一个对象。您尝试过吗?当我这样做时,
$arrayObject=new arrayObject($xmlObj)我收到异常“InvalidArgumentException”,消息为“SimpleXMLElement类型的重载对象与ArrayObject不兼容”
是否缺少参数?我查看了文档,没有发现任何错误。可能是某种递归映射的数组映射?
Method 1 time to execute: 0.00066113471984863
Method 2 time to execute: 0.00059700012207031
Method 3 time to execute: 0.00090503692626953
Method 4 time to execute: 0.00050783157348633

Method 1 time to execute: 0.00066494941711426
Method 2 time to execute: 0.00057506561279297
Method 3 time to execute: 0.00089788436889648
Method 4 time to execute: 0.00052714347839355

Method 1 time to execute: 0.00067400932312012
Method 2 time to execute: 0.00057005882263184
Method 3 time to execute: 0.0009000301361084
Method 4 time to execute: 0.00051212310791016