搜索数组:array_filter vs loop

时间:2011-07-22 14:26:31

标签: php arrays multidimensional-array

我是PHP的新手,需要有关阵列搜索的建议。

如果我想在多维数组中搜索一个元素,我可以使用array_filter或者我可以遍历数组并查看是否存在符合我标准的元素。

我在很多地方都看到了这两个建议。哪个更快?下面是一个示例数组。

Array ( 
  [0] => Array ( 
    [id] => 4e288306a74848.46724799
    [question] => Which city is capital of New York?
    [answers] => Array ( 
      [0] => Array ( 
        [id] => 4e288b637072c6.27436568 
        [answer] => New York 
        [question_id_fk] => 4e288306a74848.46724799 
        [correct] => 0 
      ) 
      [1] => Array ( 
        [id] => 4e288b63709a24.35955656 
        [answer] => Albany 
        [question_id_fk] => 4e288306a74848.46724799 
        [correct] => 1 
      ) 
    )
  )
)

我这样搜索。

$thisQuestion = array_filter($pollQuestions, function($q) {
  return questionId == $q["id"];
});

5 个答案:

答案 0 :(得分:2)

我做了一个测试脚本,因为我有点怀疑...内部函数怎么会比循环慢...

但是实际上是真的。另一个有趣的结果是php 7.4几乎比7.2快10倍!

您可以尝试一下

<?php
/*** Results on my machine ***
php 7.2
array_filter: 2.5147440433502
foreach: 0.13733291625977
for i: 0.24090600013733

php 7.4
array_filter: 0.057109117507935
foreach: 0.021071910858154
for i: 0.027867078781128
**/

ini_set('memory_limit', '500M');
$data = range(0, 1000000);

// ARRAY FILTER
$start = microtime(true);
$newData = array_filter($data, function ($item) {
    return $item % 2;
});
$end = microtime(true);

echo "array_filter: ";
echo $end - $start . PHP_EOL;

// FOREACH
$start = microtime(true);
$newData = array();
foreach ($data as $item) {
    if ($item % 2) {
        $newData[] = $item;
    }
}
$end = microtime(true);

echo "foreach: ";
echo $end - $start . PHP_EOL;

// FOR
$start = microtime(true);
$newData = array();
$numItems = count($data);
for ($i = 0; $i < $numItems; $i++) {
    if ($data[$i] % 2) {
        $newData[] = $data[$i];
    }
}
$end = microtime(true);

echo "for i: ";
echo $end - $start . PHP_EOL;

答案 1 :(得分:1)

我知道,问题是陈旧的,但我不同意接受的答案。我也想知道,如果foreach()循环与array_filter()函数之间存在差异,并找到以下帖子:

http://www.levijackson.net/are-array_-functions-faster-than-loops/

Levi Jackson做得很好,比较了几个循环和array_*()函数的速度。根据他的说法,foreach()循环比array_filter()函数更快。虽然它几乎没有产生如此大的差异,但是当你必须处理大量数据时,它开始变得重要。

答案 2 :(得分:1)

我知道这是一个老问题,但是我要付出两分钱:对我来说,使用foreach循环比使用array_filter快得多。使用foreach,通过id进行搜索需要1.4秒,而使用过滤器则需要8.6秒。

答案 3 :(得分:0)

Array_Filter

  

迭代输入数组中的每个值,将它们传递给   回调函数。如果回调函数返回true,则为当前   输入的值返回到结果数组中。数组键是   保留。

和我一样。

答案 4 :(得分:0)

根据我的经验,foreach更快。我认为这与函数调用开销,参数检查,复制到变量返回指令等有关。使用基本语法时,解析后的代码更可能更接近于编译/解释后的字节码,并具有更好的优化能力核心。

常见的规则是:任何事物都更简单,运行速度更快(意味着更少的检查,更少的功能性,只要它具有您所需要的一切)