确定一个平面数组中的任何值是否存在于另一个平面数组中

问题描述 投票:0回答:3
$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
值并结束该过程。

php arrays validation intersection short-circuiting
3个回答
5
投票

只需使用

array_intersect
功能即可:

$arr = ['a', 'b', 'c', 'd'];
$vars = ['a', 'f', 'g'];

$result = count(array_intersect($vars, $arr)) == 1;    
var_dump($result);   // true

3
投票

对我来说,您在问题中获得的代码几乎是解决此问题的最佳方法。您只需将

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
,您不会注意到任何差异,并且代码更具可读性。


0
投票

不使用

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)
    )
);
© www.soinside.com 2019 - 2024. All rights reserved.