Menu

in_array() w PHP: czy wartość jest w tablicy

in_array($needle, $haystack) zwraca true, gdy wartość jest w tablicy. Podaj true jako trzeci argument, in_array('1', $ids, true), aby wykonać ścisłe sprawdzenie, w którym musi zgadzać się też typ. Strona opisuje flagę strict, wyszukiwanie bez rozróżniania wielkości liter, sprawdzanie kilku wartości, tablice zagnieżdżone i szybszą alternatywę z isset.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

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.

in_array: dopasowania luźne (==) i ścisłe (===)
Point at or tap a cell to read it as PHP.
$a == $btruefalsenull01"0""1""""abc""10""1e1"10[]
true
false
null
0
1
"0"
"1"
""
"abc"
"10"
"1e1"
10
[]
Every cell computed by PHP 8.3.19.

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łanieZwracaSzybkość na dużej tablicy
in_array($v, $arr, true)true albo falseprzegląda każdy element
array_search($v, $arr, true)klucz albo falseprzegląda każdy element
isset($set[$v])true albo falsejedno 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.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ