in_array wiele wartości


110

Jak sprawdzić wiele wartości, takich jak:

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

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

To przykład, więc rozumiesz trochę lepiej, wiem, że to nie zadziała.

Odpowiedzi:


200

Przecinaj cele ze stogiem siana i upewnij się, że przecięcie jest dokładnie równe celom:

$haystack = array(...);

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

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

Zwróć uwagę, że wystarczy zweryfikować, że wynikowe przecięcie ma taki sam rozmiar, jak tablica wartości docelowych, aby powiedzieć, że $haystackjest to nadzbiór $target.

Aby sprawdzić, czy co najmniej jedna wartość w $targetjest również w $haystack, możesz wykonać następujące sprawdzenie:

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

13
to rozwiązanie nie jest najlepsze: $ needles = array (1,2); $ haystack = array (1,1,2,3); return (count (array_intersect ($ stóg siana, $ igieł)) == count ($ igieł)); to zwróci fałsz, to nie jest dobre. Rozwiązanie Rok Kralj jest dobre w tym przypadku.
ihtus

1
Myślę, że ta tablica powinna zawierać unikalne dane, w przeciwnym razie to rozwiązanie nie zadziała
Hashan Kanchana

182

Jako programista prawdopodobnie powinieneś zacząć uczyć się operacji na zbiorach (różnica, suma, przecięcie). Możesz sobie wyobrazić swoją tablicę jako jeden „zestaw”, a klucze, których szukasz jako drugi.

Sprawdź, czy istnieją WSZYSTKIE igły

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

Sprawdź, czy JAKAŚ z igieł istnieje

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
Uwaga: ten typ deklaracji tablicy to> = PHP 5.4
Claudiu Hojda

Doskonałe rozwiązanie pod warunkiem, że nie musisz przeprowadzać ścisłego porównania.
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

Wychodząc z odpowiedzi @Rok Kralj (najlepsza IMO), aby sprawdzić, czy w stogu siana nie ma igieł, możesz użyć (bool)zamiast !!nich czasami mylące podczas przeglądu kodu.

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
Byłoby to bardziej przydatne jako komentarz do odpowiedzi Roka niż jako nowa odpowiedź.
faintsignal

@Jaymin jak to (podałeś szczegóły ZERO) ... działa idealnie dla mnie glot.io/snippets/f7dhw4kmju
sMyles

@sMyles Próbowałem użyć wartości ciągu w tablicy zamiast liczby całkowitej. Możesz raz spróbować ze swojej strony i daj mi znać.
Jaymin

@Jaymin nadal nie ma tego problemu glot.io/snippets/f7dhw4kmju
sMyles

Ta konwersja bool nie jest tutaj odpowiednia, ponieważ array_intersect zwraca tablicę, która może być pusta lub niepusta. Rozwiązanie @ rok-kralj jest jedynym preferowanym rozwiązaniem.
codelearner

3

IMHO Mark Elliot to najlepsze rozwiązanie tego problemu. Jeśli chcesz wykonać bardziej złożone operacje porównania między elementami tablicy ORAZ korzystasz z PHP 5.3, możesz również pomyśleć o czymś takim:

<?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);

Zależy to od zamknięcia; funkcja porównania może stać się znacznie potężniejsza. Powodzenia!


Zmieniłem już sposób, w jaki wszystko zrobiłem, więc w ostatecznym wyniku nie musiałem tego robić w żaden sposób, chociaż zawsze dobrze się uczyć, dzięki za wkład i poświęcony czas!
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 () zwraca tablicę zawierającą wszystkie wartości tablicy tablica1, które są obecne we wszystkich argumentach. Pamiętaj, że klucze są zachowane.

Zwraca tablicę zawierającą wszystkie wartości z tablicy tablica1, których wartości znajdują się we wszystkich parametrach.


empty () - Określa, czy zmienna jest pusta

Zwraca FALSE, jeśli zmienna istnieje i ma niepustą, niezerową wartość. W przeciwnym razie zwraca TRUE.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.