Data di dalam array jarang dipakai seluruhnya sekaligus: kita perlu memeriksa apakah sebuah nilai ada, menemukan posisinya, menyaring elemen yang lolos syarat, atau memotong sebagian isinya. PHP menyediakan function pencarian dan penyaringan yang mencakup semua kebutuhan tersebut. Pada Chapter ini kita membedah in_array() beserta jebakan mode longgar, pola aman array_search(), perbedaan array_key_exists() dengan isset(), lalu naik ke array_filter(), array_slice(), array_splice(), dan array_chunk() untuk operasi bentuk data.

Memeriksa Keberadaan Nilai dengan in_array #

in_array() menerima nilai yang dicari (needle) dan array tempat pencarian (haystack), lalu mengembalikan true atau false. Perbandingannya sensitif terhadap kapitalisasi dan secara default memakai aturan longgar ==:

php
<?php
$buahTersedia = ["apel", "jeruk", "mangga"];

var_dump(in_array("jeruk", $buahTersedia));
var_dump(in_array("pisang", $buahTersedia));
var_dump(in_array("Jeruk", $buahTersedia));

Output yang Dihasilkan:

text
bool(true)
bool(false)
bool(false)

Pencarian "jeruk" berhasil karena nilainya persis sama, sedangkan "Jeruk" dengan huruf besar gagal — perbandingan string peka terhadap kapitalisasi. Parameter ketiga opsional mengubah perbandingan menjadi ketat ===, yang juga memeriksa tipe data:

php
<?php
$nomorSeri = ["101", "102", "103"];

var_dump(in_array(101, $nomorSeri));
var_dump(in_array(101, $nomorSeri, true));

Output yang Dihasilkan:

text
bool(true)
bool(false)

Elemen array bertipe string "101", sedangkan yang dicari bertipe integer 101. Mode longgar menganggap "101" == 101 sehingga mengembalikan true, sedangkan mode ketat menolak karena tipenya berbeda. Data yang datang dari formulir HTML, query string, atau json_decode() selalu berupa string — mode ketat mencegah kecocokan palsu antara "101" dan 101.

php
<?php
var_dump(0 == "apel");
var_dump(in_array(0, ["apel", "jeruk"]));
var_dump(in_array("apel", [0]));

Output yang Dihasilkan:

text
bool(false)
bool(false)
bool(false)

Ketiga pemanggilan mengembalikan false di PHP 8 — hasil yang sehat dan masuk akal. Meskipun begitu, membiasakan diri memakai mode ketat tetap merupakan pertahanan terbaik karena perbandingan longgar antara string numerik dan integer (seperti "101" dan 101 di atas) masih diizinkan.

array_search() melangkah lebih jauh dari in_array(): alih-alih true/false, function ini mengembalikan kunci tempat nilai ditemukan, atau false bila tidak ada. Pola pemeriksaannya selalu memakai perbandingan !== false, seperti berikut:

php
<?php
$peserta = ["Budi", "Siti", "Andi"];

echo array_search("Siti", $peserta) . "\n";

$indeksBudi = array_search("Budi", $peserta);

var_dump($indeksBudi == false);
var_dump($indeksBudi !== false);

Output yang Dihasilkan:

text
1
bool(true)
bool(true)

array_search("Siti", ...) mengembalikan 1 — indeks elemen yang dicari. Di situlah letak jebakannya: "Budi" ditemukan di indeks 0, dan karena 0 == false bernilai true, pemeriksaan longgar akan menganggap “tidak ditemukan”. Perbandingan !== false pada baris terakhir adalah satu-satunya pola yang benar; mode ketat juga tersedia sebagai parameter ketiga. Contoh berikut memakai kedua teknik sekaligus pada array asosiatif:

php
<?php
$hargaProduk = ["kopi" => 85000, "teh" => 15000];

$kunci = array_search(15000, $hargaProduk, true);

if ($kunci !== false) {
    echo "Produk seharga 15000: $kunci\n";
}

var_dump(array_search(99000, $hargaProduk, true));

Output yang Dihasilkan:

text
Produk seharga 15000: teh
bool(false)

Pencarian nilai 15000 mengembalikan kunci "teh", sedangkan nilai 99000 yang tidak ada mengembalikan false. Ketika Anda hanya perlu tahu ada atau tidak, in_array() lebih murah dan lebih jelas; ketika posisinya dibutuhkan, array_search() adalah pilihannya.

array_key_exists vs isset #

Untuk memeriksa keberadaan kunci, tersedia array_key_exists(). Pesaingnya yang lebih sering dipakai adalah isset(), dan keduanya berbeda pada satu kasus penting — nilai null:

php
<?php
$pengguna = [
    "nama" => "Budi",
    "email" => null,
];

var_dump(isset($pengguna["email"]));
var_dump(array_key_exists("email", $pengguna));
var_dump(array_key_exists("telepon", $pengguna));

Output yang Dihasilkan:

text
bool(false)
bool(true)
bool(false)

Kunci email ada tetapi nilainya null. isset() mengembalikan false karena menganggap nilai null sama dengan “tidak terpasang”, sedangkan array_key_exists() tetap true karena hanya memeriksa keberadaan kunci. Gunakan isset() untuk pemeriksaan cepat “apakah aman dipakai”, dan array_key_exists() ketika keberadaan kunci itu sendiri yang bermakna — misalnya membedakan kolom email yang memang kosong dari kolom yang tidak pernah ada.

Menyaring Elemen dengan array_filter #

array_filter() menjalankan callback untuk setiap elemen dan hanya menyimpan elemen yang membuat callback mengembalikan true. Inilah alat utama menyaring koleksi data tanpa menulis loop manual:

php
<?php
$nomorPesan = [101, 205, 310, 412, 533];

$ganjil = array_filter($nomorPesan, function ($nomor) {
    return $nomor % 2 === 1;
});

echo implode(", ", $ganjil) . "\n";
echo implode(", ", array_keys($ganjil)) . "\n";

$ganjilRapi = array_values($ganjil);
echo implode(", ", $ganjilRapi) . "\n";

Output yang Dihasilkan:

text
101, 205, 533
0, 1, 4
101, 205, 533

Mari kita bedah baris demi baris:

  1. function ($nomor): callback dipanggil sekali per elemen dengan nilai elemen sebagai argument (fungsi tanpa nama ini akan dibahas tuntas pada Section Fungsi).
  2. $nomor % 2 === 1: mengembalikan true hanya untuk bilangan ganjil, sehingga 101, 205, dan 533 lolos.
  3. Kunci dipertahankan: perhatikan baris array_keys($ganjil) yang menghasilkan 0, 1, 4 — kunci asli tetap melekat sehingga muncul celah 2 dan 3.
  4. array_values($ganjil): menomori ulang hasil menjadi 0, 1, 2 ketika kita butuh array indexed yang rapi.

Callback juga dapat menerima kunci alih-alih nilai melalui flag ARRAY_FILTER_USE_KEY, atau keduanya sekaligus dengan ARRAY_FILTER_USE_BOTH. Flag ditulis sebagai parameter ketiga:

php
<?php
$hadir = [
    101 => "Budi",
    102 => "Siti",
    103 => "Andi",
];

$hadirFinal = array_filter(
    $hadir,
    function ($id) {
        return $id !== 102;
    },
    ARRAY_FILTER_USE_KEY
);

echo implode(", ", $hadirFinal) . "\n";

Output yang Dihasilkan:

text
Budi, Andi

Dengan ARRAY_FILTER_USE_KEY, callback menerima 101, 102, dan 103 (bukan nama-namanya), lalu mengeluarkan anggota dengan id 102 dari daftar kehadiran. Tanpa flag apa pun, callback menerima nilai; dengan ARRAY_FILTER_USE_BOTH, callback menerima (nilai, kunci).

Memotong dan Menyusun Ulang dengan array_slice, array_splice, array_chunk #

array_slice() menyalin sebagian isi array tanpa mengubah aslinya. Parameter keduanya adalah posisi awal (boleh negatif untuk menghitung dari belakang) dan parameter ketiga jumlah elemen:

php
<?php
$peserta = ["Budi", "Siti", "Andi", "Rina", "Dewi"];

$tigaTeratas = array_slice($peserta, 0, 3);
echo implode(", ", $tigaTeratas) . "\n";

$duaTerakhir = array_slice($peserta, -2);
echo implode(", ", $duaTerakhir) . "\n";

$skor = [10 => 95, 11 => 87, 12 => 78];
$sebagian = array_slice($skor, 1, 2);
print_r($sebagian);

Output yang Dihasilkan:

text
Budi, Siti, Andi
Rina, Dewi
Array
(
    [0] => 87
    [1] => 78
)

Pemanggilan array_slice($peserta, 0, 3) menyalin tiga elemen pertama, dan array_slice($peserta, -2) mengambil dua elemen terakhir. Perhatikan jebakan pada contoh $skor: kunci integer hasil salinan dinomori ulang dari 0 secara default — parameter keempat true bila kita ingin kunci asli dipertahankan, sedangkan kunci string selalu dipertahankan apa pun yang terjadi.

Berbeda dengan array_slice() yang menyalin, array_splice() memotong array aslinya secara langsung, mengembalikan elemen yang dibuang, dan opsional menyisipkan elemen pengganti di titik potong:

php
<?php
$playlist = ["Rock", "Pop", "Jazz", "Dangdut", "Keroncong"];

$dihapus = array_splice($playlist, 1, 2, ["Indie", "Ska"]);

echo "Dihapus: " . implode(", ", $dihapus) . "\n";
echo "Sisa: " . implode(", ", $playlist) . "\n";

Output yang Dihasilkan:

text
Dihapus: Pop, Jazz
Sisa: Rock, Indie, Ska, Dangdut, Keroncong

array_splice($playlist, 1, 2, ...) membuang dua elemen mulai posisi 1 (Pop dan Jazz), menyimpannya ke $dihapus, lalu menyalip Indie dan Ska pada celah tersebut. Karena beroperasi langsung pada array asli, $playlist setelah operasi berisi Rock, Indie, Ska, Dangdut, Keroncong.

Terakhir, array_chunk() membelah array menjadi array-of-array berukuran seragam — pasangan alami untuk pagination dan pembagian kelompok:

php
<?php
$namaPeserta = ["Budi", "Siti", "Andi", "Rina", "Dewi"];

$kelompok = array_chunk($namaPeserta, 2);

foreach ($kelompok as $indeks => $anggota) {
    echo "Kelompok " . ($indeks + 1) . ": " . implode(", ", $anggota) . "\n";
}

Output yang Dihasilkan:

text
Kelompok 1: Budi, Siti
Kelompok 2: Andi, Rina
Kelompok 3: Dewi

Lima peserta terbagi menjadi tiga kelompok berisi dua orang, dengan kelompok terakhir menerima sisa satu orang. Untuk data peserta yang bersarang, gabungkan array_chunk() dengan array_column() dari chapter Array Keys dan Values saat perlu mengekstrak kolom tertentu dari setiap potongan.

Perbandingan Antar-Array — array_diff dan array_intersect #

Sebagai pembuka bab lanjutan: array_diff() mengembalikan elemen array pertama yang tidak ada di array pembanding, sedangkan array_intersect() justru mengembalikan yang ada di keduanya. Sekilas polanya:

php
<?php
$timA = ["Budi", "Siti", "Andi"];
$timB = ["Siti", "Rina"];

$hanyaDiA = array_diff($timA, $timB);

echo implode(", ", $hanyaDiA) . "\n";

Output yang Dihasilkan:

text
Budi, Andi

Anggota $timA yang tidak terdapat di $timB adalah Budi dan Andi. Pembahasan lengkap beserta array_merge(), array_intersect_key(), dan sepupu mereka menanti pada chapter Array Merge dan Difference .

Ringkasan #

in_array() memeriksa keberadaan nilai dengan mode longgar atau ketat, array_search() mengembalikan posisinya dan wajib diperiksa dengan !== false, sementara array_key_exists() menangkap kunci bernilai null yang luput dari isset(). array_filter() menyaring elemen melalui callback dengan kunci yang perlu dirapikan array_values(), array_slice() dan array_splice() memotong data, dan array_chunk() membelahnya menjadi potongan seragam. Dengan pencarian dan penyaringan dikuasai, kita siap melangkah ke trio transformasi array paling berpengaruh: array_map(), array_filter() lanjutan, dan array_reduce().

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

contoh.php

Unduh berkas
php
<?php

/**
 * contoh.php — rangkuman Chapter Searching dan Filtering Arrays.
 * Jalankan: php contoh.php
 */

// 1. Pencarian nilai dengan mode ketat.
$peserta = ["Budi", "Siti", "Andi"];
var_dump(in_array("Siti", $peserta, true));
var_dump(in_array("siti", $peserta, true));

// 2. array_search dengan pola !== false.
$hargaProduk = ["kopi" => 85000, "teh" => 15000];
$kunci = array_search(15000, $hargaProduk, true);
if ($kunci !== false) {
    echo "Produk seharga 15000: $kunci\n";
}

// 3. array_filter menyaring lalu array_values merapikan kunci.
$nomorPesan = [101, 205, 310, 412, 533];
$ganjil = array_values(array_filter($nomorPesan, function ($nomor) {
    return $nomor % 2 === 1;
}));
echo "Pesanan ganjil: " . implode(", ", $ganjil) . "\n";

// 4. array_slice dan array_chunk.
$tigaTeratas = array_slice($peserta, 0, 3);
echo "Tiga teratas: " . implode(", ", $tigaTeratas) . "\n";

$kelompok = array_chunk($peserta, 2);
foreach ($kelompok as $indeks => $anggota) {
    echo "Kelompok " . ($indeks + 1) . ": " . implode(", ", $anggota) . "\n";
}