提问人:AXAI 提问时间:10/6/2017 更新时间:10/7/2017 访问量:804
检查数组中是否存在多个变量之一
Check if one of multiple variables exists in array
问:
$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
$array
true
false
true
例如,我希望函数在第一个值处停止并结束该过程。['a', 'b', 'c', 'g']
true
答:
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_intersect
normal 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
$array
foreach
就像我在评论中提到的 - 如果你的数组很小,那么只需使用 ,你不会注意到任何差异,并且代码更具可读性。array_intersect
评论
0赞
AXAI
10/7/2017
如果这种形式有匹配项,不会覆盖吗?return false;
return true
0赞
iainn
10/7/2017
否 - 该函数将只运行到它到达的第一个语句。在此之后,不会处理任何内容。return
评论
return false
return false