1

考虑以下代码片段:

示例 #1

$array = Array(1,2,3,4,5,6,7);
$array_test = Array(3,5,4,7,3,6,7,8,8,9,3);

foreach($array_test as $value) {
   if(in_array($value, $array)) {
       // do some magic here
   }
}

示例 #2

$array = Array(1,2,3,4,5,6,7);
$array_test = Array(3,5,4,7,3,6,7,8,8,9,3);

$array_index = Array();
foreach($array as $value) {
    $array_index[ $value ] = true;
}

foreach($array_test as $value) {
   if(isset($array_index[ $value ])) {
       // do some magic here
   }
}

显然,这两个片段都做同样的工作。在某些数组示例中,示例 #1 比示例 #2 快。

我确信我们都处于这两种情况,但是我的问题是:

  • 我应该总是选择#2吗?
  • 我什么时候应该选择#1?当大小$array * $array_test< 10 时?<100?<1000?
  • 如何确定在特定情况下哪种方法更好?
  • 除了使用 temp table 之外,也许还有其他技巧$array_index。我不记得其他编程语言中的类似情况,一切都准备好了

请注意关联键。

有人已经问过非常相似的问题:

4

2 回答 2

2

在您的第二个示例中,您必须先构造 的“翻转”值,$array然后才能使用isset(). 顺便说一句,您也可以使用array_flip()它。

如果您可以立即使用数组键(无需转换),请使用它,因为它显然比查找键的方式isset()快得多,并且因为它是一种语言结构。in_array()

如果您不能在没有转换的情况下使用键,则可以考虑将in_array()其用于小型数组。对于更大的阵列,可能值得运行基准测试以确定阵列转换步骤是否仍然值得。

最后,在很大程度上取决于具体情况,您也可以使用其中一个array_intersect_函数,主要是为了避免在 PHP 代码中循环。

于 2013-01-23T03:01:14.360 回答
1

isset 总是比 in_array 快,因为键是唯一的,而值不是。键是唯一的这一事实提供了值不可能的优化可能性。

于 2020-08-16T15:42:40.657 回答