in_array多个值


110

如何检查多个值,例如:

$arg = array('foo','bar');

if(in_array('foo','bar',$arg))

这是一个例子,所以您了解得更多一些,我知道它不会起作用。

Answers:


200

将目标与干草堆相交,并确保交点与目标完全相等:

$haystack = array(...);

$target = array('foo', 'bar');

if(count(array_intersect($haystack, $target)) == count($target)){
    // all of $target is in $haystack
}

请注意,您只需要验证生成的交集的大小是否与目标值数组的大小相同即可说$haystack是的超集$target

为了确认至少有一个值,$target也是$haystack,你可以这样做检查:

 if(count(array_intersect($haystack, $target)) > 0){
     // at least one of $target is in $haystack
 }

13
这个解决方案不是最好的:$ needles = array(1,2); $ haystack = array(1,1,2,3); return(count(array_intersect($ haystack,$ needles))== count($ needles)); 这将返回false,那不是很好。Rok Kralj的解决方案适用于这种情况。
ihtus 2014年

1
我认为这些阵列应保存唯一的数据,否则此解决方案将不起作用
Hashan Kanchana

182

作为开发人员,您可能应该开始学习集合操作(​​差异,并集,交集)。您可以将数组想象为一个“集合”,而您正在寻找的键是另一个。

检查是否存在所有针头

function in_array_all($needles, $haystack) {
   return empty(array_diff($needles, $haystack));
}

echo in_array_all( [3,2,5], [5,8,3,1,2] ); // true, all 3, 2, 5 present
echo in_array_all( [3,2,5,9], [5,8,3,1,2] ); // false, since 9 is not present

检查是否有任何针头

function in_array_any($needles, $haystack) {
   return !empty(array_intersect($needles, $haystack));
}

echo in_array_any( [3,9], [5,8,3,1,2] ); // true, since 3 is present
echo in_array_any( [4,9], [5,8,3,1,2] ); // false, neither 4 nor 9 is present

9
注意:这种数组声明的类型> = PHP 5.4
Claudiu Hojda 2014年

如果您不需要进行严格的比较,那就是出色的解决方案。
faintsignal

14
if(in_array('foo',$arg) && in_array('bar',$arg)){
    //both of them are in $arg
}

if(in_array('foo',$arg) || in_array('bar',$arg)){
    //at least one of them are in $arg
}

7

从@Rok Kralj答案(最佳IMO)出发,检查大海捞针中是否有任何针头,可以使用(bool)代替!!,有时在代码检查期间可能会造成混淆。

function in_array_any($needles, $haystack) {
   return (bool)array_intersect($needles, $haystack);
}

echo in_array_any( array(3,9), array(5,8,3,1,2) ); // true, since 3 is present
echo in_array_any( array(4,9), array(5,8,3,1,2) ); // false, neither 4 nor 9 is present

https://glot.io/snippets/f7dhw4kmju


9
作为对Rok答案的评论,它比作为新答案更有用。
faintsignal

@Jaymin怎么这样(您提供了零详细信息)...对我来说非常好glot.io/snippets/f7dhw4kmju
sMyles

@sMyles我尝试在数组而不是整数中使用字符串值。您可以从一侧尝试一次,让我知道。
杰明(Jaymin)'18

@Jaymin仍然没有那个问题glot.io/snippets/f7dhw4kmju
sMyles

这种布尔转换在这里不合适,因为array_intersect返回的数组可以为空或非空。@ rok-kralj解决方案是唯一的首选解决方案。
codelearner19年

3

恕我直言,Mark Elliot的解决方案是解决此问题的最佳方案。如果您需要在数组元素之间进行更复杂的比较操作并且您使用的是PHP 5.3,则可能还会考虑以下内容:

<?php

// First Array To Compare
$a1 = array('foo','bar','c');

// Target Array
$b1 = array('foo','bar');


// Evaluation Function - we pass guard and target array
$b=true;
$test = function($x) use (&$b, $b1) {
        if (!in_array($x,$b1)) {
                $b=false;
        }
};


// Actual Test on array (can be repeated with others, but guard 
// needs to be initialized again, due to by reference assignment above)
array_walk($a1, $test);
var_dump($b);

这依赖于闭包。比较功能可以变得更加强大。祝好运!


我已经改变了已经完成所有工作的方式,因此在最终输出中我不需要做任何事情,尽管它总是很容易学习的,感谢您的投入和时间!
daryl

2
if(empty(array_intersect([21,22,23,24], $check_with_this)) {
 print "Not found even a single element";
} else {
 print "Found an element";
}

array_intersect()返回一个数组,其中包含所有自变量中存在的所有array1值。请注意,密钥被保留。

返回一个包含array1中所有值的数组,其值存在于所有参数中。


empty()—确定变量是否为空

如果var存在并且具有非空,非零值,则返回FALSE。否则返回TRUE。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.