您的位置:首页 > 其它

转载 foreach比递归效率低

2016-07-11 14:23 197 查看
转载原文于phpchina

刚在phpcms函数文件看到一个将数组转换为序列化的url函数,使用了三层foreach实现,我就很奇怪,为什么不用递归,群里面问了问,有几位朋友说是递归效率差,所以就做了这个测试

测试结果大出意料:

用嵌套foreach 执行需要时间为7秒多

用递归执行时间4秒多

废话不多说,先说下环境

winxp,1.5g内存,双核1.6

测试数组:三层含有100万健的数组

下面提供源码

<?php
$begin_time = microtime_float();
/**
*
* 将数组转换为&a=1&b=1 url形式
* @param array $data
* @param string $urlencode url编码函数,为空则不进行url编码
* @return string
*/
//自己写的递归函数
function array2url($data,$urlencode="rawurlencode"){
!empty($urlencode)&&!function_exists($urlencode)&&$urlencode='';
$str='';
if(isset($data)&&is_array($data)){
foreach($data as $k=>$v){
if(isset($v)&&is_array($v)){
$str.=array2url($v,$urlencode);
}else{
if(!empty($urlencode)){
$str.="&".$urlencode($k)."=".$urlencode($v);
}else{
$str.="&".($k)."=".($v);
}
}
}
}
return $str;
}

//phpcms原函数
function arrayforeach($data){
$s='';
$sep = '&';
foreach($data as $k => $v) {
if(is_array($v)) {
$s2 = $sep2 = '';
foreach($v as $k2 => $v2) {
if(is_array($v2)) {
$s3 = $sep3 = '';
foreach($v2 as $k3=>$v3) {
$k3 = $k3;
$s3 .= "$sep3{$k}[$k2][$k3]=".rawurlencode($v3);
$sep3 = '&';
}
$s .= $sep2.$s3;
} else {
$s2 .= "$sep2{$k}[$k2]=".rawurlencode($v2);
$sep2 = '&';
$s .= $sep.$s2;
}
}
} else {
$s .= "$sep$k=".rawurlencode($v);
}
}
return $s;
}

function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}

//创建一个三层键值总共100w的数组
function create_array(){
$data=array();
for($i=0;$i<100;$i++){
for($j=0;$j<100;$j++){
for($k=0;$k<100;$k++){
$data[$i][$j][$k]=rand(10000, 100000000);
}
}
}
return $data;
}

$a=create_array();

//测试1,自己的函数,执行时间4秒多点
//array2url($a,null);
//echo $second=microtime_float()-$begin_time;

//phpcms内置嵌套foreach,执行时间7秒多
arrayforeach($a);
echo microtime_float()-$begin_time;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: