转载原文于phpchina
刚在phpcms函数文件看到一个将数组转换为序列化的url函数,使用了三层foreach实现,我就很奇怪,为什么不用递归,群里面问了问,有几位朋友说是递归效率差,所以就做了这个测试
测试结果大出意料:
用嵌套foreach 执行需要时间为7秒多
用递归执行时间4秒多
废话不多说,先说下环境
winxp,1.5g内存,双核1.6
测试数组:三层含有100万健的数组
下面提供源码
1 <?php 2 $begin_time = microtime_float(); 3 /** 4 * 5 * 将数组转换为&a=1&b=1 url形式 6 * @param array $data 7 * @param string $urlencode url编码函数,为空则不进行url编码 8 * @return string 9 */ 10 //自己写的递归函数 11 function array2url($data,$urlencode="rawurlencode"){ 12 !empty($urlencode)&&!function_exists($urlencode)&&$urlencode=''; 13 $str=''; 14 if(isset($data)&&is_array($data)){ 15 foreach($data as $k=>$v){ 16 if(isset($v)&&is_array($v)){ 17 $str.=array2url($v,$urlencode); 18 }else{ 19 if(!empty($urlencode)){ 20 $str.="&".$urlencode($k)."=".$urlencode($v); 21 }else{ 22 $str.="&".($k)."=".($v); 23 } 24 } 25 } 26 } 27 return $str; 28 } 29 30 //phpcms原函数 31 function arrayforeach($data){ 32 $s=''; 33 $sep = '&'; 34 foreach($data as $k => $v) { 35 if(is_array($v)) { 36 $s2 = $sep2 = ''; 37 foreach($v as $k2 => $v2) { 38 if(is_array($v2)) { 39 $s3 = $sep3 = ''; 40 foreach($v2 as $k3=>$v3) { 41 $k3 = $k3; 42 $s3 .= "$sep3{$k}[$k2][$k3]=".rawurlencode($v3); 43 $sep3 = '&'; 44 } 45 $s .= $sep2.$s3; 46 } else { 47 $s2 .= "$sep2{$k}[$k2]=".rawurlencode($v2); 48 $sep2 = '&'; 49 $s .= $sep.$s2; 50 } 51 } 52 } else { 53 $s .= "$sep$k=".rawurlencode($v); 54 } 55 } 56 return $s; 57 } 58 59 function microtime_float(){ 60 list($usec, $sec) = explode(" ", microtime()); 61 return ((float)$usec + (float)$sec); 62 } 63 64 //创建一个三层键值总共100w的数组 65 function create_array(){ 66 $data=array(); 67 for($i=0;$i<100;$i++){ 68 for($j=0;$j<100;$j++){ 69 for($k=0;$k<100;$k++){ 70 $data[$i][$j][$k]=rand(10000, 100000000); 71 } 72 } 73 } 74 return $data; 75 } 76 77 $a=create_array(); 78 79 80 //测试1,自己的函数,执行时间4秒多点 81 //array2url($a,null); 82 //echo $second=microtime_float()-$begin_time; 83 84 //phpcms内置嵌套foreach,执行时间7秒多 85 arrayforeach($a); 86 echo microtime_float()-$begin_time;