浅谈PHP遍历二维数组的性能问题

PHP遍历二维数组的性能

数组的遍历是项目开发过程中经常碰到的问题,之前一直没有深入研究过这个事情,只是最近为了优化系统运行效率,所以做了以下小测试。

下面是测试过程,我们需要在二维数组中找出category_id等于某一值的时候所对应的cate_name。我们通常称之为“大海捞针”。

首先是我们常用的foreach。假设我们已经获取了这个数组记为$catelist。代码如下:

  1. function getCateName1($id,$arr){
  2.     foreach($arr as $key =>$value){
  3.         if($value['category_id'] == $id){
  4.             $data[] = $value['cate_name'];
  5.         }
  6.     }
  7.     return $data;
  8. }

在测试中$arr的数据都是一样的,时间大约为110ms。

第二种方法是通过array_filter()进行遍历的,源码如下:

  1. function getCateName2($id,$arr){
  2.     $data = array_filter($arr,function($itemuse ($id){
  3.         return $item['category_id'] == $id;
  4.     });
  5.     return array_column($data,'cate_name');
  6. }

这个执行方法我本以为效率能够有所提升,但是多次测试后基本跟上一个foreach的方法执行效率差不多,略有提升,效果不明显。所以我又尝试了第三种方法。源码如下:

  1. function getCateName2($id,$arr){
  2.     $data = array_map(function($itemuse ($id){
  3.         if($item['category_id'] == $id){
  4.             return $item['cate_name'];
  5.         }
  6.     },$arr);
  7.     return $data[$id];
  8. }

经过这次改造之后,效率有了明显的提升。从最初的110ms,降到了60-70ms之间。

经过一番折腾,虽然实现的都是查找二维数组中某字段等于特定值时另一字段的值。但是收获还是挺多的。希望这篇分享也能给其他朋友一个指引吧。

你想把广告放到这里吗?

发表评论

您必须 登录 才能发表留言!