Respostas:
Cruze os alvos com o palheiro e certifique-se de que a intersecção seja exatamente igual aos alvos:
$haystack = array(...);
$target = array('foo', 'bar');
if(count(array_intersect($haystack, $target)) == count($target)){
// all of $target is in $haystack
}
Observe que você só precisa verificar se o tamanho da interseção resultante é do mesmo tamanho da matriz de valores de destino para dizer que $haystack
é um superconjunto de $target
.
Para verificar se pelo menos um valor em $target
também está in $haystack
, você pode fazer esta verificação:
if(count(array_intersect($haystack, $target)) > 0){
// at least one of $target is in $haystack
}
Como desenvolvedor, você provavelmente deve começar a aprender operações de conjunto (diferença, união, interseção). Você pode imaginar seu array como um "conjunto" e as chaves que você está procurando como o outro.
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
Saindo de resposta @Rok Kralj (melhor IMO) para verificar se alguma das agulhas existem no palheiro, você pode usar (bool)
em vez de !!
que às vezes pode ser confuso durante a revisão do código.
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
A melhor solução de IMHO Mark Elliot para este problema. Se você precisa fazer operações de comparação mais complexas entre os elementos da matriz E está no PHP 5.3, também pode pensar em algo como o seguinte:
<?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);
Isso depende de um fechamento; função de comparação pode se tornar muito mais poderosa. Boa sorte!
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 () retorna um array contendo todos os valores de array1 que estão presentes em todos os argumentos. Observe que as chaves são preservadas.
Retorna uma matriz contendo todos os valores em array1, cujos valores existem em todos os parâmetros.
empty () - Determina se uma variável está vazia
Retorna FALSE se var existe e tem um valor não vazio, diferente de zero. Caso contrário, retorna TRUE.