in_array($needle, $haystack) değer dizide bir yerdeyse true, değilse false döndürür. Aynı türü de şart koşmak için üçüncü argüman olarak true verin, in_array($needle, $haystack, true); varsayılan olarak kullanılması gereken bu katı biçimdir.
in_array() yalnızca değerlere bakar. Bir anahtarın var olup olmadığını kontrol etmek için array_key_exists() veya isset() kullanın.
Katı (strict) parametre
Üçüncü argüman olmadan in_array() karşılaştırmadan önce türleri dönüştüren == ile karşılaştırır. true ile === ile karşılaştırır: değer ve tür ikisi de eşleşmelidir. Dizi sayıları ve dizgeleri karıştırdığı anda fark ortaya çıkar; formlardan, URL'lerden ve CSV dosyalarından gelen verilerde bu yaygındır.
Aşağıdaki her hücre, o değer çifti için PHP 8.3'te == ve === operatörlerinin döndürdüğü sonuçtur. Kullandığınız modda aranan değer ve herhangi bir eleman tabloda true veriyorsa in_array() true yanıtını verir. Sekmeler arasında geçin ve null, true ve sayısal dizge satırlarına bakın.
| $a == $b | true | false | null | 0 | 1 | "0" | "1" | "" | "abc" | "10" | "1e1" | 10 | [] |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| true | |||||||||||||
| false | |||||||||||||
| null | |||||||||||||
| 0 | |||||||||||||
| 1 | |||||||||||||
| "0" | |||||||||||||
| "1" | |||||||||||||
| "" | |||||||||||||
| "abc" | |||||||||||||
| "10" | |||||||||||||
| "1e1" | |||||||||||||
| 10 | |||||||||||||
| [] |
PHP 8'de bir kural değişti: sayısal olmayan bir dizge artık 0 değerine eşit değildir, bu yüzden in_array('abc', [0]) bugün false iken PHP 7'de true idi. PHP 7 için yazılmış kodlar bazen buna dayanıyordu; bu da true verip dönüştürme kurallarına güvenmemek için bir neden daha. Karşılaştırma operatörleri sayfası bunları ayrıntılı olarak açıklar.
Büyük küçük harf duyarsız in_array
in_array() dizgeleri birebir karşılaştırır, bu yüzden 'PHP' ve 'php' farklıdır. Kontrol etmeden önce hem aranan değeri hem diziyi küçük harfe çevirin. mb_strtolower() aksanlı ve Latin olmayan harfleri de işler.
Aynı anda birkaç değeri kontrol etme
in_array() tek bir aranan değer alır. Birkaç değer için dizileri küme gibi karşılaştırın: array_diff() eksik olan değerleri döndürür, yani boş bir sonuç hepsinin var olduğu anlamına gelir; array_intersect() ise bulunan değerleri döndürür.
array_diff() ve array_intersect() değerleri dizge olarak karşılaştırır, bu yüzden orada 1 ve '1' eşit sayılır.
Çok boyutlu bir dizide in_array
in_array() iç içe dizilerin içinde arama yapmaz. Herhangi bir satırda belirli bir değere sahip bir alan olup olmadığını kontrol etmek için önce o alanı array_column() ile çıkarın, sonra düz listede arayın.
Son satır aranan değerin kendisinin de bir dizi olabileceğini gösterir: aynı anahtarlara, değerlere ve sıraya sahip özdeş bir satırla eşleşir.
in_array, array_search ve isset karşılaştırması
Üçü de "orada mı?" sorusunu yanıtlar, ama farklı şeyler döndürür ve farklı hızlarda çalışır:
| Çağrı | Döndürür | Büyük bir dizide hız |
|---|---|---|
in_array($v, $arr, true) | true veya false | her elemanı tarar |
array_search($v, $arr, true) | anahtar veya false | her elemanı tarar |
isset($set[$v]) | true veya false | tek bir hash araması |
Değerin nerede olduğunu bilmeniz gerektiğinde array_search() kullanın. Birçok değeri aynı büyük listeye karşı kontrol ettiğinizde listeyi bir kez ters çevirin ki değerleri anahtar olsun, sonra isset() kullanın.
Süreler çalıştırmadan çalıştırmaya değişir ama aradaki fark değişmez: isset() araması sabit kalırken in_array() listenin boyutuyla büyür. array_flip() yalnızca dizge ve tam sayı değerlerle çalışır ve tekrarlar tek bir anahtara iner; bu, üyelik kontrolü için önemli değildir.
Sıkça Sorulan Sorular
in_array fonksiyonunun üçüncü parametresi ne işe yarar?
Katı karşılaştırmayı açar. in_array($x, $arr, true) === ile karşılaştırır, bu yüzden değerin yanı sıra tür de eşleşmelidir: in_array('1', [1, 2], true) false olur. Bu parametre olmadan PHP == ile karşılaştırır ve önce türleri dönüştürür.
in_array ile her zaman katı modu mu kullanmalıyım?
Genellikle evet. Gevşek mod in_array(null, [0]), in_array(true, ['any string']) ve in_array('1e1', ['10']) ifadelerinin hepsinin true döndürmesine yol açar. Yalnızca bir formdan gelen '5' değerinin 5 tam sayısıyla bilerek eşleşmesini istediğinizde kapalı bırakın.
in_array'i büyük küçük harfe duyarsız nasıl yaparım?
İki tarafı da küçük harfe çevirin: in_array(strtolower($needle), array_map('strtolower', $haystack), true). Metin ASCII olmayan harfler içerebiliyorsa mb_strtolower kullanın.
Birkaç değerin bir dizide olup olmadığını nasıl kontrol ederim?
Hepsini şart koşmak için geriye hiçbir şey kalmadığını kontrol edin: !array_diff($needles, $haystack). En az birini şart koşmak için bir kesişim olup olmadığına bakın: (bool) array_intersect($needles, $haystack).
in_array yavaş mı?
Diziyi eleman eleman tarar, bu yüzden birçok kez kontrol edilen büyük dizilerde yavaştır. Diziyi bir kez $set = array_flip($haystack); ile ters çevirin ve tek bir hash araması olan isset($set[$value]) kullanın.