In_array 多个值

如何检查多个值,例如:

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


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

这是一个例子,让你更好地理解,我知道它不会工作。

162381 次浏览
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
}

将目标与干草堆交叉,并确保交叉点的数量等于目标的数量:

$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
}

恕我直言,马克 · 埃利奥特的解决方案是解决这个问题的最佳方案。如果你使用 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);

这依赖于闭包; 比较函数可以变得更强大。 祝你好运!

在数组中搜索多个值对应于集合操作(集合差异和交集) ,如下所示。

在你的问题中,你没有指定你想要哪种类型的数组搜索,所以我给你两个选项。

所有的针都存在

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


$animals = ["bear", "tiger", "zebra"];
echo in_array_all(["bear", "zebra"], $animals); // true, both are animals
echo in_array_all(["bear", "toaster"], $animals); // false, toaster is not an animal

任何一根针都存在

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


$animals = ["bear", "tiger", "zebra"];
echo in_array_any(["toaster", "tiger"], $animals); // true, tiger is an amimal
echo in_array_any(["toaster", "brush"], $animals); // false, no animals here

重要的考虑

如果您正在搜索的指针集很小并且事先已知,那么如果只使用 in_array调用的逻辑链接,您的代码可能会更清晰,例如:

$animals = ZooAPI.getAllAnimals();
$all = in_array("tiger", $animals) && in_array("toaster", $animals) && ...
$any = in_array("bear", $animals) || in_array("zebra", $animals) || ...

关闭@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

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中的所有值,这些值存在于所有参数中。


空()ーー 确定变量是否为空

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

如果你想通过比较检查来优化这个搜索,只有我会这么做:

public function items_in_array($needles, $haystack)
{
foreach ($needles as $needle) {
if (!in_array($needle, $haystack)) {
return false;
}
}


return true;
}

如果你愿意做它丑陋做多个 if(in_array(...&&in_array(...甚至更快。

我使用 array _ intersect、 array _ diff 和 in _ array 对100和100,000个数组元素以及2到15个针进行了测试。

In _ array 总是明显地更快,即使我不得不为不同的针做15倍。Array _ diff 也比 array _ intersect 快很多。

因此,如果您只是试图搜索一些内容,以查看它们是否存在于一个数组 in _ array ()中,那么从性能方面来说是最好的。如果您需要知道实际的差异/匹配,那么使用 array _ diff/array _ intersect 可能更容易。

如果我在下面这个丑陋的示例中计算错误,请随时告诉我。

<?php






$n1 = rand(0,100000);
$n2 = rand(0,100000);
$n2 = rand(0,100000);
$n3 = rand(0,100000);
$n4 = rand(0,100000);
$n5 = rand(0,100000);
$n6 = rand(0,100000);
$n7 = rand(0,100000);
$n8 = rand(0,100000);
$n9 = rand(0,100000);
$n10 = rand(0,100000);
$n11 = rand(0,100000);
$n12 = rand(0,100000);
$n13 = rand(0,100000);
$n14 = rand(0,100000);
$n15 = rand(0,100000);
$narr = [$n1, $n2, $n3, $n4, $n5, $n6, $n7, $n8, $n9, $n10, $n11, $n12, $n13, $n14, $n15];


$arr = [];
for($i = 0; $i<100000 ; $i++)
{
    

$arr[] = rand(0,100000);
    

}




function array_in_array($needles, $haystack)
{
foreach($needles as $needle)
{
    

if (!in_array($needle, $haystack))
{
return false;
}


}
    

return true;
}


$start_time = microtime(true);
$failed = true;
if(array_in_array($narr, $arr))
{
echo "<br>true0<br>";
}


$total_time = microtime(true) - $start_time;
echo "<hr>";
echo($total_time);






$start_time = microtime(true);


if (
in_array($n1, $arr) !== false &&
in_array($n2, $arr) !== false &&
in_array($n3, $arr) !== false &&
in_array($n4, $arr) !== false &&
in_array($n5, $arr) !== false &&
in_array($n6, $arr) !== false &&
in_array($n7, $arr) !== false &&
in_array($n8, $arr) !== false &&
in_array($n9, $arr) !== false &&
in_array($n10, $arr) !== false &&
in_array($n11, $arr) !== false &&
in_array($n12, $arr) !== false &&
in_array($n13, $arr) !== false &&
in_array($n14, $arr) !== false &&
in_array($n15, $arr)!== false) {
echo "<br>true1<br>";
}


$total_time = microtime(true) - $start_time;
echo "<hr>";
echo($total_time);


$first_time = $total_time;


echo "<hr>";


$start_time = microtime(true);


if (empty($diff = array_diff($narr,$arr)))
{


echo "<br>true2<br>";
}




$total_time = microtime(true) - $start_time;
echo($total_time);
print_r($diff);
echo "<hr>";


echo "<hr>";
if ($first_time > $total_time)
{
echo "First time was slower";
}


if ($first_time < $total_time)
{
echo "First time was faster";
}


echo "<hr>";




$start_time = microtime(true);


if (count(($itrs = array_intersect($narr,$arr))) == count($narr))
{


echo "<br>true3<br>";
print_r($result);
}




$total_time = microtime(true) - $start_time;
echo "<hr>";
echo($total_time);


print_r($itrs);


echo "<hr>";


if ($first_time < $total_time)
{
echo "First time was faster";
}




echo "<hr>";
print_r($narr);
echo "<hr>";
print_r($arr);