PHP两层foreach循环合并具有相同元素值的优化方法
首先,业务需求是这样的,两个数组
$array1=[ [ 'id'=>1, 'name'=>'name1' ], [ 'id'=>2, 'name'=>'name2' ], [ 'id'=>3, 'name'=>'name3' ] ]; $array2=[ [ 'uid'=>1, 'uname'=>'uname1' ], [ 'uid'=>2, 'uname'=>'uname2' ], [ 'uid'=>3, 'uname'=>'uname3' ] ];
将两个数组根据id和uid的值合并为一个数组,并且移除除uid。
合并之后的数组如下:
$array3=[ [ 'id'=>1, 'name'=>'name1', 'uname'=>'uname1' ], [ 'id'=>2, 'name'=>'name2', 'uname'=>'uname2' ], [ 'id'=>3, 'name'=>'name3', 'uname'=>'uname3' ] ];
起始急于完成任务,用了最直接的两层foreach循环。之后考虑到后期可能数据增加,两层foreach循环效率太低,于是便想出来另一种方法,经测试,效率大大提升。
代码如下:
//初始化两个数组 $array1=[]; $array2=[]; //为上面两个数组各填充一万个元素 for ($i=1; $i <= 10000; $i++) { $array1[]=[ 'id'=>$i, 'name'=>'name'.$i ]; $array2[]=[ 'uid'=>$i, 'uname'=>'uname'.$i ]; } //定义计时微秒函数 function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } //=========Method 1=========== $method1_start=microtime_float(); echo "Method 1 开始时间:".$method1_start."<br />"; foreach ($array1 as $key => $value){ foreach ($array2 as $k => $v){ if ($value['id']===$v['uid']){ $temp=array_merge($value,$v); unset($temp['uid']); $result1[]=$temp; } } } $method1_end=microtime_float(); echo "Method 1 结束时间:".$method1_end."<br />"; // print_r($result1); echo "*************************************************<br/>"; //=========Method 2=========== $method2_start=microtime_float(); echo "Method 2 开始时间:".$method2_start."<br />"; foreach ($array1 as $key => $value) { $temp1[$value['id']]=$value; } foreach ($array2 as $key => $value) { $temp2=array_merge($value,$temp1[$value['uid']]); unset($temp2['uid']); $result2[$key]=$temp2; } $method2_end=microtime_float(); echo "Method 2 结束时间:".$method2_end."<br />"; // print_r($result2);
从这里可以看到,第一种方法,两层foreach循环,用了10秒左右,而第二种方法用了0.01秒,差距相当的大。