$array = ['a', 'b', 'c', 'd'];
$vars = ['a', 'f', 'g'];
foreach ($vars as $var) {
if (in_array($var, $array)) {
return true;
} else {
return false;
}
}
我如何检查
$vars
中是否存在$array
之一?只要其中一个是true
,如果其他所有都是false
,这不是问题,但是如果有超过1个true
值,
例如
['a', 'b', 'c', 'g']
我希望函数停止在第一个true
值并结束该过程。
只需使用
array_intersect
功能即可:
$arr = ['a', 'b', 'c', 'd'];
$vars = ['a', 'f', 'g'];
$result = count(array_intersect($vars, $arr)) == 1;
var_dump($result); // true
对我来说,您在问题中获得的代码几乎是解决此问题的最佳方法。您只需将
return false
移至循环后面,以便处理所有值:
foreach ($vars as $var) {
if (in_array($var, $array)) {
return true;
}
}
return false;
这与使用
array_intersect
的解决方案的工作原理相同,但优点是只需要处理最少量的循环。考虑以下数据:
$vars = [1, 2, 3, 4, ... 1,000,000,000];
$array = [1, 10, ...];
使用
array_intersect
的解决方案需要检查 $vars
中的 every元素与
$array
中的 every元素,而跳出循环的解决方案只需要检查直到第一个匹配项。如果您的两个数组都非常大,您可以通过使用两个嵌套的
foreach
循环来进一步优化。
就像我在评论中提到的 - 如果您的数组很小,那么只需使用
array_intersect
,您不会注意到任何差异,并且代码更具可读性。
不使用
array_intersect()
(或 array_diff()
)来完成此任务的唯一原因是时间复杂度。 这些函数不提供条件中断,因此即使第一个元素满足,它们也将始终遍历整个有效负载。
在 PHP8.4 之前,您需要编写手动循环并有条件地短路遍历。 现在,您只需使用
array_any()
即可。 演示
$array = ['a', 'b', 'c', 'd'];
$vars = ['a', 'f', 'g'];
var_export(
array_any(
$vars,
fn($v) => in_array($v, $array)
)
);