比如一个多维数组
$arr = array(
'0'=>array('1','2'),
'1'=>array('2','3'),
'2'=>array('3','4'),
'3'=>array('4','5'),
'4'=>array('5','6'),
)
我要合并$arr的所有子集数组变成一个新的数组
$new_arr = array('1','2','2','3','3','4','4','5','5','6');
最快的方法是什么
array_walk
版一号代码:array_walk_recursive
版二号代码:优美的写法需要PHP版本的支持,如果不支持的话就把匿名函数和
use
改成普通函数和global
的形式就好了。补充答案:
foreach
循环普通版三号代码:double foreach
嵌套循环普通版四号代码:见 @thbourlove 的答案。
既然题主强调了一下时间的话那我就认真做一个测评好了,为了增加可比性我又写了一个普通版用循环的第三版作为对比代码,通过测试得到四组代码在不同数组长度的情况下所消耗的时间的一个表:
array_walk
array_walk_recursive
foreach
double foreach
*注1:表格左侧为数组的长度,默认算的是一级数组,例如题目中的数组长度为5。每个二级数组的长度统一为题目示例中的2。
*注2:表格中的数据默认单位为秒
*注3:本来其实测试数据为100000长度的数组的,结果
array_walk
花了204s,我就放弃那么长了。*注4:
double foreach
的代码参见 @thbourlove 的答案,另外此算法的运算时间由于之前三者比较的数据已经不存在了,所以我重新找了一组规格相同的数据和第二种算法做了同期测试,并根据两组数据之间的关系得到了表格现在的数据。通过以上数据可以得出,性能方面的话还是 @thbourlove 的嵌套循环是最高的,不过个人是代码美观控,所以还是比较偏爱第二种。
通过以上数据可以得出三种方法中array_walk_recursive
方法无疑是最快的。array_walk_recursive
的低版本兼容写法我在这里补充一下:至于修改后的代码的效率测试我就不在这里多做了,相比最终得到的结果应该也是一样的。