检查数组中是否存在多个变量之一

Check if one of multiple variables exists in array

提问人:AXAI 提问时间:10/6/2017 更新时间:10/7/2017 访问量:804

问:

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

foreach ($vars as $var) {
    if (in_array($var, $array)) {
        return true;
    } else {
        return false;
    }
}

如何检查是否存在其中之一?如果所有其他的值都不是问题,则只需要其中一个,但是如果值超过 1 个,$vars$arraytruefalsetrue

例如,我希望函数在第一个值处停止并结束该过程。['a', 'b', 'c', 'g']true

PHP的

评论

2赞 apokryfos 10/6/2017
在你检查完所有内容之前不要这样做。移动下环return falsereturn false

答:

5赞 RomanPerekhrest 10/6/2017 #1

简单功能:array_intersect

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

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

评论

0赞 iainn 10/6/2017
它必须是,不是吗?此外,使用array_intersect而不是基本循环的缺点是,你不能在第一个成功的结果时中断,所以它的性能不高。虽然对于小型阵列来说,这不是问题。>= 1
0赞 AXAI 10/6/2017
@iainn我想会更好,因为我不希望用户输入两个以上的有效值。== 1
0赞 iainn 10/6/2017
@AXAI 也许我当时误会了。我以为多个匹配值可以吗?您只想检查至少 1 个。无论如何,如果它对你有用,那么这就是重要的事情。
0赞 AXAI 10/6/2017
@iainn没问题,但正如我从你那里了解到的那样,这并不比 ?或者,如果阵列不大,性能差异很小?array_intersectnormal loop
3赞 iainn 10/7/2017 #2

对我来说,你在问题中得到的代码几乎是解决这个问题的最好方法。你只需要在循环之后移动 to,以便处理所有值: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$arrayforeach

就像我在评论中提到的 - 如果你的数组很小,那么只需使用 ,你不会注意到任何差异,并且代码更具可读性。array_intersect

评论

0赞 AXAI 10/7/2017
如果这种形式有匹配项,不会覆盖吗?return false;return true
0赞 iainn 10/7/2017
否 - 该函数将只运行到它到达的第一个语句。在此之后,不会处理任何内容。return