数组的遍历是项目开发过程中经常碰到的问题,之前一直没有深入研究过这个事情,只是最近为了优化系统运行效率,所以做了以下小测试。
下面是测试过程,我们需要在二维数组中找出category_id等于某一值的时候所对应的cate_name。我们通常称之为“大海捞针”。
首先是我们常用的foreach。假设我们已经获取了这个数组记为$catelist。代码如下:
- function getCateName1($id,$arr){
- foreach($arr as $key =>$value){
- if($value['category_id'] == $id){
- $data[] = $value['cate_name'];
- }
- }
- return $data;
- }
在测试中$arr的数据都是一样的,时间大约为110ms。
第二种方法是通过array_filter()进行遍历的,源码如下:
- function getCateName2($id,$arr){
- $data = array_filter($arr,function($item) use ($id){
- return $item['category_id'] == $id;
- });
- return array_column($data,'cate_name');
- }
这个执行方法我本以为效率能够有所提升,但是多次测试后基本跟上一个foreach的方法执行效率差不多,略有提升,效果不明显。所以我又尝试了第三种方法。源码如下:
- function getCateName2($id,$arr){
- $data = array_map(function($item) use ($id){
- if($item['category_id'] == $id){
- return $item['cate_name'];
- }
- },$arr);
- return $data[$id];
- }
经过这次改造之后,效率有了明显的提升。从最初的110ms,降到了60-70ms之间。
经过一番折腾,虽然实现的都是查找二维数组中某字段等于特定值时另一字段的值。但是收获还是挺多的。希望这篇分享也能给其他朋友一个指引吧。