in_array vários valores

110

Como faço para verificar vários valores, como:

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

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

Esse é um exemplo para você entender um pouco melhor, sei que não vai funcionar.

daryl
fonte

Respostas:

200

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 $targettambé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
 }
Mark Elliot
fonte
13
esta solução não é a melhor: $ needles = array (1,2); $ haystack = array (1,1,2,3); return (count (array_intersect ($ haystack, $ needles)) == count ($ needles)); isso retornará falso, isso não é bom. A solução de Rok Kralj é boa para este caso.
18 de
1
Acho que essa matriz deve conter dados exclusivos, caso contrário, essa solução não funcionará
Hashan Kanchana
182

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.

Verifique se existem TODAS as agulhas

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

Verifique se existe ALGUMA das agulhas

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
Rok Kralj
fonte
8
Nota: este tipo de declaração de array é> = PHP 5.4
Claudiu Hojda
Excelente solução, desde que você não precise realizar uma comparação estrita.
faintsignal de
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
}
RiaD
fonte
7

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

https://glot.io/snippets/f7dhw4kmju

sMyles
fonte
9
Isso seria mais útil como um comentário sobre a resposta de Rok do que como uma nova resposta.
faintsignal
@Jaymin como assim (você forneceu detalhes ZERO) ... funciona perfeitamente bem para mim glot.io/snippets/f7dhw4kmju
sMyles
@sMyles Eu tentei usar o valor da string no array em vez de inteiro. Você pode tentar uma vez do seu lado e me avisar.
Jaymin
@Jaymin ainda não tem esse problema glot.io/snippets/f7dhw4kmju
sMyles
Esta conversão bool não é adequada aqui, uma vez que array_intersect retorna um array que pode estar vazio ou não vazio. A solução @rok-kralj é a única preferida.
codelearner de
3

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!

maraspin
fonte
Eu mudei a forma como já fazia tudo, então no resultado final não precisei fazer nada disso, embora seja sempre bom aprender, obrigado por sua contribuição e seu tempo!
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 () 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.

Umesh Patil
fonte