in_array($needle, $haystack) mengembalikan true jika nilainya ada di suatu tempat di array dan false jika tidak. Berikan true sebagai argumen ketiga, in_array($needle, $haystack, true), agar tipenya juga harus sama; bentuk strict itulah yang sebaiknya kamu pakai secara default.
in_array() hanya melihat nilai. Untuk memeriksa apakah sebuah key ada, pakai array_key_exists() atau isset().
Parameter strict
Tanpa argumen ketiga, in_array() membandingkan dengan ==, yang mengonversi tipe sebelum membandingkan. Dengan true, fungsi ini membandingkan dengan ===: nilai dan tipenya harus sama-sama cocok. Perbedaannya langsung terlihat begitu array mencampur angka dan string, yang umum terjadi pada data dari form, URL, dan file CSV.
Setiap sel di bawah ini adalah hasil == dan === untuk pasangan nilai tersebut di PHP 8.3. in_array() menjawab true jika needle dan salah satu elemen menghasilkan true di tabel untuk mode yang kamu pakai. Pindah-pindah tab dan perhatikan baris null, true, dan string numerik.
| $a == $b | true | false | null | 0 | 1 | "0" | "1" | "" | "abc" | "10" | "1e1" | 10 | [] |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| true | |||||||||||||
| false | |||||||||||||
| null | |||||||||||||
| 0 | |||||||||||||
| 1 | |||||||||||||
| "0" | |||||||||||||
| "1" | |||||||||||||
| "" | |||||||||||||
| "abc" | |||||||||||||
| "10" | |||||||||||||
| "1e1" | |||||||||||||
| 10 | |||||||||||||
| [] |
Ada satu aturan yang berubah di PHP 8: string non-numerik tidak lagi sama dengan 0, jadi in_array('abc', [0]) bernilai false sekarang tetapi true di PHP 7. Kode yang ditulis untuk PHP 7 kadang bergantung pada hal itu, satu alasan lagi untuk memberikan true dan tidak bergantung pada aturan konversi. Halaman operator perbandingan menjelaskannya secara lengkap.
in_array tanpa membedakan huruf besar dan kecil
in_array() membandingkan string secara persis, jadi 'PHP' dan 'php' berbeda. Ubah needle dan array-nya menjadi huruf kecil sebelum memeriksa. mb_strtolower() juga menangani huruf beraksen dan non-Latin.
Memeriksa beberapa nilai sekaligus
in_array() menerima satu needle. Untuk beberapa nilai, bandingkan array-array itu sebagai himpunan: array_diff() mengembalikan needle yang tidak ada, jadi hasil kosong berarti semuanya ada, dan array_intersect() mengembalikan needle yang ditemukan.
array_diff() dan array_intersect() membandingkan nilai sebagai string, jadi 1 dan '1' dianggap sama di sana.
in_array pada array multidimensi
in_array() tidak mencari di dalam array bersarang. Untuk memeriksa apakah ada baris yang field-nya bernilai tertentu, ambil field itu dulu dengan array_column(), lalu cari di list yang sudah datar.
Baris terakhir menunjukkan bahwa needle-nya sendiri bisa berupa array: needle itu cocok dengan baris yang identik, dengan key, nilai, dan urutan yang sama.
in_array vs array_search vs isset
Ketiganya menjawab "apakah nilainya ada?", tetapi mengembalikan hal yang berbeda dan berjalan dengan kecepatan yang berbeda:
| Pemanggilan | Mengembalikan | Kecepatan pada array besar |
|---|---|---|
in_array($v, $arr, true) | true atau false | memindai setiap elemen |
array_search($v, $arr, true) | key-nya, atau false | memindai setiap elemen |
isset($set[$v]) | true atau false | satu kali hash lookup |
Pakai array_search() saat kamu perlu tahu di mana nilainya berada. Saat kamu memeriksa banyak nilai terhadap list besar yang sama, balik list itu sekali agar nilainya menjadi key, lalu pakai isset().
Waktunya berubah dari satu run ke run berikutnya, tetapi selisihnya tidak: lookup isset() tetap datar sementara in_array() bertambah seiring ukuran list. array_flip() hanya bekerja untuk nilai string dan integer, dan nilai duplikat melebur menjadi satu key, yang tidak masalah untuk pemeriksaan keanggotaan.
Pertanyaan yang sering diajukan
Apa fungsi parameter ketiga in_array?
Parameter ini mengaktifkan perbandingan strict. in_array($x, $arr, true) membandingkan dengan ===, jadi tipenya harus cocok selain nilainya: in_array('1', [1, 2], true) bernilai false. Tanpanya, PHP membandingkan dengan == dan mengonversi tipe lebih dulu.
Apakah saya harus selalu memakai mode strict dengan in_array?
Biasanya ya. Mode loose membuat in_array(null, [0]), in_array(true, ['any string']), dan in_array('1e1', ['10']) semuanya mengembalikan true. Matikan hanya saat kamu memang ingin '5' dari form cocok dengan integer 5.
Bagaimana cara membuat in_array tidak membedakan huruf besar dan kecil?
Ubah kedua sisinya menjadi huruf kecil: in_array(strtolower($needle), array_map('strtolower', $haystack), true). Pakai mb_strtolower saat teksnya bisa berisi huruf non-ASCII.
Bagaimana cara memeriksa apakah beberapa nilai ada di array?
Untuk mewajibkan semuanya ada, periksa bahwa tidak ada yang tersisa: !array_diff($needles, $haystack). Untuk mewajibkan setidaknya satu, periksa apakah ada irisan: (bool) array_intersect($needles, $haystack).
Apakah in_array lambat?
Fungsi ini memindai array elemen demi elemen, jadi lambat untuk array besar yang diperiksa berkali-kali. Balik array-nya sekali dengan $set = array_flip($haystack); lalu pakai isset($set[$value]), yang hanya satu kali hash lookup.