in_array($needle, $haystack) zwraca true, jeśli wartość jest gdzieś w tablicy, i false, jeśli jej nie ma. Podaj true jako trzeci argument, in_array($needle, $haystack, true), aby wymagać także tego samego typu; tej ścisłej formy warto używać domyślnie.
in_array() patrzy tylko na wartości. Aby sprawdzić, czy istnieje klucz, użyj array_key_exists() albo isset().
Parametr strict
Bez trzeciego argumentu in_array() porównuje przez ==, które przed porównaniem konwertuje typy. Z true porównuje przez ===: muszą zgadzać się i wartość, i typ. Różnica wychodzi, gdy tylko tablica łączy liczby i stringi, co jest częste przy danych z formularzy, adresów URL i plików CSV.
Każda komórka poniżej to wynik == i === dla danej pary wartości w PHP 8.3. in_array() odpowiada true, jeśli igła i którykolwiek element dają true w tabeli dla używanego trybu. Przełączaj zakładki i spójrz na wiersze null, true i stringów liczbowych.
| $a == $b | true | false | null | 0 | 1 | "0" | "1" | "" | "abc" | "10" | "1e1" | 10 | [] |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| true | |||||||||||||
| false | |||||||||||||
| null | |||||||||||||
| 0 | |||||||||||||
| 1 | |||||||||||||
| "0" | |||||||||||||
| "1" | |||||||||||||
| "" | |||||||||||||
| "abc" | |||||||||||||
| "10" | |||||||||||||
| "1e1" | |||||||||||||
| 10 | |||||||||||||
| [] |
W PHP 8 zmieniła się jedna zasada: string nieliczbowy nie jest już równy 0, więc in_array('abc', [0]) daje dziś false, a w PHP 7 dawało true. Kod pisany pod PHP 7 czasem na tym polegał, co jest kolejnym powodem, by podawać true i nie zależeć od zasad konwersji. Opisuje je w całości strona o operatorach porównania.
in_array bez rozróżniania wielkości liter
in_array() porównuje stringi dokładnie, więc 'PHP' i 'php' się różnią. Przed sprawdzeniem zamień na małe litery i igłę, i tablicę. mb_strtolower() obsługuje też litery z akcentami i znaki spoza alfabetu łacińskiego.
Sprawdzanie kilku wartości naraz
in_array() przyjmuje jedną igłę. Dla kilku porównaj tablice jak zbiory: array_diff() zwraca brakujące igły, więc pusty wynik oznacza, że są wszystkie, a array_intersect() zwraca igły, które znaleziono.
array_diff() i array_intersect() porównują wartości jako stringi, więc 1 i '1' liczą się tam jako równe.
in_array na tablicy wielowymiarowej
in_array() nie szuka wewnątrz zagnieżdżonych tablic. Aby sprawdzić, czy któryś wiersz ma pole o danej wartości, najpierw wyciągnij to pole przez array_column(), a potem przeszukaj płaską listę.
Ostatnia linia pokazuje, że igła sama może być tablicą: pasuje do wiersza identycznego, z tymi samymi kluczami, wartościami i kolejnością.
in_array vs array_search vs isset
Wszystkie trzy odpowiadają na pytanie „czy to tam jest?”, ale zwracają różne rzeczy i działają z różną szybkością:
| Wywołanie | Zwraca | Szybkość na dużej tablicy |
|---|---|---|
in_array($v, $arr, true) | true albo false | przegląda każdy element |
array_search($v, $arr, true) | klucz albo false | przegląda każdy element |
isset($set[$v]) | true albo false | jedno wyszukiwanie w tablicy mieszającej |
Użyj array_search(), gdy musisz wiedzieć, gdzie jest wartość. Gdy sprawdzasz wiele wartości względem tej samej dużej listy, odwróć listę raz, aby jej wartości stały się kluczami, i użyj isset().
Czasy zmieniają się między uruchomieniami, ale różnica nie: wyszukiwanie przez isset() pozostaje stałe, a in_array() rośnie z rozmiarem listy. array_flip() działa tylko dla wartości będących stringami i liczbami całkowitymi, a duplikaty łączą się w jeden klucz, co przy sprawdzaniu przynależności nie ma znaczenia.
Najczęściej zadawane pytania
Do czego służy trzeci parametr in_array?
Włącza ścisłe porównanie. in_array($x, $arr, true) porównuje przez ===, więc oprócz wartości musi zgadzać się typ: in_array('1', [1, 2], true) daje false. Bez niego PHP porównuje przez == i najpierw konwertuje typy.
Czy zawsze używać trybu strict w in_array?
Zwykle tak. W trybie luźnym in_array(null, [0]), in_array(true, ['any string']) i in_array('1e1', ['10']) zwracają true. Wyłącz go tylko wtedy, gdy świadomie chcesz, aby '5' z formularza pasowało do liczby całkowitej 5.
Jak sprawić, by in_array nie rozróżniało wielkości liter?
Zamień obie strony na małe litery: in_array(strtolower($needle), array_map('strtolower', $haystack), true). Użyj mb_strtolower, gdy tekst może zawierać litery spoza ASCII.
Jak sprawdzić, czy kilka wartości jest w tablicy?
Aby wymagać wszystkich, sprawdź, że nic nie zostało: !array_diff($needles, $haystack). Aby wymagać co najmniej jednej, sprawdź część wspólną: (bool) array_intersect($needles, $haystack).
Czy in_array jest wolne?
Przegląda tablicę element po elemencie, więc jest wolne dla dużych tablic sprawdzanych wiele razy. Odwróć tablicę raz przez $set = array_flip($haystack); i użyj isset($set[$value]), co jest pojedynczym wyszukiwaniem w tablicy mieszającej.