5-5: Array Functions
Objectives
- Menggunakan essential array functions
- Menguasai
array_map(),array_filter(),array_reduce() - Mencari data dengan
array_search(),in_array(),array_keys() - Mengurutkan array dengan berbagai function sort
- Menggabungkan dan memotong array dengan
array_merge(),array_slice(),array_diff()
Kenapa Perlu Array Functions?
PHP punya ratusan built-in function untuk array. Daripada menulis loop manual setiap kali, function-function ini membuat kode lebih pendek, lebih jelas, dan lebih sedikit bug. Perhatikan pola berikut:
<?php
$numbers = [1, 2, 3, 4, 5];
// Gaya manual: loop + array baru
$squared = [];
foreach ($numbers as $n) {
$squared[] = $n * $n;
}
// Gaya functional: array_map
$squared = array_map(fn($n) => $n * $n, $numbers);
print_r($squared);
// Output:
// Array
// (
// [0] => 1
// [1] => 4
// [2] => 9
// [3] => 16
// [4] => 25
// )
?>
Kedua gaya di atas menghasilkan output yang sama. Yang kedua lebih pendek dan "menyatakan apa yang kamu mau" (map setiap angka ke kuadratnya), bukan "bagaimana caranya" (loop, tambah ke array, dst). Saat sudah terbiasa, gaya functional jauh lebih cepat ditulis dan dibaca.
Tiga function utama membentuk "pipeline" data yang bisa dibayangkan seperti jalur produksi:
Data mengalir dari kiri ke kanan: array_map mengubah bentuk setiap elemen, array_filter menyaring mana yang dipertahankan, dan array_reduce (di ujung) menggabungkan semuanya jadi satu nilai. Kamu bisa menyambungnya: array_reduce(array_filter(array_map(...))).
Traversal Functions
array_map()
array_map() menerapkan sebuah function ke setiap elemen array dan mengembalikan array hasil baru. Jumlah elemen hasil sama dengan jumlah elemen input.
<?php
$numbers = [1, 2, 3, 4, 5];
// Double each number
$squared = array_map(function($n) {
return $n * $n;
}, $numbers);
print_r($squared);
// Output:
// Array
// (
// [0] => 1
// [1] => 4
// [2] => 9
// [3] => 16
// [4] => 25
// )
// Versi arrow function (lebih ringkas)
$squared = array_map(fn($n) => $n * $n, $numbers);
// Multiple arrays — callback menerima satu argumen per array
$a = [1, 2, 3];
$b = [4, 5, 6];
$sum = array_map(fn($x, $y) => $x + $y, $a, $b);
print_r($sum);
// Output:
// Array
// (
// [0] => 5
// [1] => 7
// [2] => 9
// )
?>
Saat array_map() dipakai dengan lebih dari satu array, panjang hasil mengikuti array terpendek. Kalau $a punya 3 elemen dan $b punya 5, hasilnya hanya 3 elemen.
Contoh nyata: mengubah semua string menjadi uppercase, atau memformat angka:
<?php
$names = ["andi", "budi", "citra"];
// Uppercase semua nama
$names = array_map(fn($name) => strtoupper($name), $names);
print_r($names);
// Output:
// Array
// (
// [0] => ANDI
// [1] => BUDI
// [2] => CITRA
// )
// Format harga dengan ribuan separator
$prices = [15000, 250000, 1000000];
$formatted = array_map(
fn($price) => "Rp" . number_format($price, 0, ",", "."),
$prices
);
print_r($formatted);
// Output:
// Array
// (
// [0] => Rp15.000
// [1] => Rp250.000
// [2] => Rp1.000.000
// )
?>
array_filter()
array_filter() menyaring array berdasarkan kondisi. Elemen yang membuat callback mengembalikan true akan dipertahankan.
<?php
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// Filter even numbers
$even = array_filter($numbers, function($n) {
return $n % 2 === 0;
});
print_r($even);
// Output:
// Array
// (
// [1] => 2
// [3] => 4
// [5] => 6
// [7] => 8
// [9] => 10
// )
// Catatan: KEY ikut dipertahankan!
// Filter associative array
$users = [
["name" => "Andi", "age" => 25],
["name" => "Budi", "age" => 17],
["name" => "Citra", "age" => 30]
];
$adults = array_filter($users, function($user) {
return $user["age"] >= 18;
});
foreach ($adults as $adult) {
echo $adult["name"] . "\n";
}
// Output:
// Andi
// Citra
?>
array_filter() mempertahankan key asli. Hasil [2, 4, 6, 8, 10] di atas punya key [1, 3, 5, 7, 9], bukan [0, 1, 2, 3, 4]. Kalau butuh key berurutan, bungkus dengan array_values(): array_values(array_filter(...)).
array_filter() dengan Key
Dengan flag ARRAY_FILTER_USE_KEY atau ARRAY_FILTER_USE_BOTH, callback bisa melihat key-nya juga:
<?php
$config = [
"db_host" => "localhost",
"db_name" => "myapp",
"debug" => true,
"cache_ttl" => 3600
];
// Filter hanya key yang mengandung "db"
$dbKeys = array_filter($config, fn($key) => str_contains($key, "db"), ARRAY_FILTER_USE_KEY);
print_r($dbKeys);
// Output:
// Array
// (
// [db_host] => localhost
// [db_name] => myapp
// )
// Filter pakai key DAN value sekaligus
$longValues = array_filter(
$config,
fn($value, $key) => strlen($key) > 5 && is_string($value),
ARRAY_FILTER_USE_BOTH
);
print_r($longValues);
// Output:
// Array
// (
// [db_host] => localhost
// [db_name] => myapp
// [cache_ttl] => 3600
// )
?>
array_reduce()
array_reduce() mengumpulkan seluruh array menjadi satu nilai dengan cara mengakumulasi hasil callback. Argumen ketiga adalah nilai awal ($carry).
<?php
$numbers = [1, 2, 3, 4, 5];
// Sum all numbers
$sum = array_reduce($numbers, function($carry, $item) {
return $carry + $item;
}, 0);
echo $sum; // Output: 15
// Concatenate strings
$words = ["Hello", "World", "PHP"];
$sentence = array_reduce($words, fn($c, $i) => $c . " " . $i);
echo trim($sentence); // Output: Hello World PHP
// Mencari nilai maksimum
$scores = [70, 85, 92, 60, 88];
$max = array_reduce($scores, fn($carry, $item) => $item > $carry ? $item : $carry, 0);
echo $max; // Output: 92
?>
Bayangkan array_reduce seperti "melipat" array: nilai $carry dibawa terus dari elemen pertama sampai terakhir, dan di akhir hanya tersisa satu nilai. array_sum($arr) sebenarnya adalah kasus khusus dari reduce.
Search Functions
array_search()
array_search() mencari nilai dan mengembalikan key/index pertamanya. Kalau tidak ditemukan, mengembalikan false.
<?php
$colors = ["red", "green", "blue", "yellow"];
// Find index of value
$index = array_search("blue", $colors);
echo $index; // Output: 2
// Not found returns false
$index = array_search("purple", $colors);
var_dump($index); // Output: bool(false)
// Hati-hati: false == 0 saat dibandingkan longgar!
if ($index == 0) {
echo "Ketemu di index 0"; // ⚠️ Salah kalau pakai ==
}
// Cara benar: cek dengan identik
if ($index !== false) {
echo "Ditemukan di index: " . $index; // Output: Ditemukan di index: 2
}
?>
array_search() mengembalikan false saat tidak ketemu — dan index 0 itu falsy! Selalu cek hasilnya dengan !== false (perbandingan identik), jangan == false atau if ($index).
in_array()
in_array() hanya mengecek apakah nilai ada (return bool), tanpa peduli di posisi mana.
<?php
$fruits = ["apple", "banana", "cherry"];
// Check if value exists
if (in_array("banana", $fruits)) {
echo "Ada pisang!"; // Output: Ada pisang!
}
// Check with strict type
$nums = [1, 2, 3];
var_dump(in_array("1", $nums)); // Output: bool(true) (loose: "1" == 1)
var_dump(in_array("1", $nums, true)); // Output: bool(false) (strict: "1" !== 1)
?>
Argumen ketiga in_array($needle, $haystack, true) mengaktifkan strict comparison. Untuk data yang berasal dari form atau JSON (semua string), strict mode mencegah bug klasik: input "1" dianggap cocok dengan angka 1.
array_keys() untuk Mencari Key
Kadang kita butuh semua key yang menyimpan nilai tertentu:
<?php
$scores = ["Andi" => 85, "Budi" => 90, "Citra" => 85, "Dewi" => 78];
// Semua orang dengan nilai 85
$keys = array_keys($scores, 85);
print_r($keys);
// Output:
// Array
// (
// [0] => Andi
// [1] => Citra
// )
// Versi ketat (strict)
$keys = array_keys($scores, "85", true);
print_r($keys);
// Output:
// Array
// (
// )
// Tidak ada karena "85" string tidak sama dengan 85 integer
?>
Sort Functions
PHP punya banyak function sort — bedanya di arah (naik/turun) dan apakah key dipertahankan.
| Function | Arah | Key | Cocok untuk |
|---|---|---|---|
sort() | Naik | Re-index | Indexed array |
rsort() | Turun | Re-index | Indexed array |
asort() | Naik | Dipertahankan | Associative by value |
arsort() | Turun | Dipertahankan | Associative by value |
ksort() | Naik | Dipertahankan | Associative by key |
krsort() | Turun | Dipertahankan | Associative by key |
usort() | Custom | Re-index | Aturan sendiri |
<?php
$numbers = [3, 1, 4, 1, 5, 9, 2, 6];
// sort() - ascending, reindex
sort($numbers);
print_r($numbers);
// Output:
// Array
// (
// [0] => 1
// [1] => 1
// [2] => 2
// [3] => 3
// [4] => 4
// [5] => 5
// [6] => 6
// [7] => 9
// )
// rsort() - descending, reindex
rsort($numbers);
echo $numbers[0]; // Output: 9
// asort() - associative, by value, keep keys
$prices = ["apple" => 3, "banana" => 1, "cherry" => 5];
asort($prices);
print_r($prices);
// Output:
// Array
// (
// [banana] => 1
// [apple] => 3
// [cherry] => 5
// )
// ksort() - associative, by key
ksort($prices);
print_r($prices);
// Output:
// Array
// (
// [apple] => 3
// [banana] => 1
// [cherry] => 5
// )
// usort() - custom sort
$words = ["banana", "apple", "cherry"];
usort($words, function($a, $b) {
return strlen($a) <=> strlen($b); // urutkan berdasarkan panjang
});
print_r($words);
// Output:
// Array
// (
// [0] => apple
// [1] => banana
// [2] => cherry
// )
?>
Semua function sort memodifikasi array aslinya (by reference) dan mengembalikan true/false, bukan array hasil. Jadi $sorted = sort($numbers); akan membuat $sorted berisi true — dan $numbers yang berubah. Urutkan dulu, baru pakai variabel aslinya.
Function Lain yang Sering Dipakai
Menggabungkan dan Memotong
<?php
$a = [1, 2, 3];
$b = [4, 5];
// array_merge - gabung dua array
$merged = array_merge($a, $b);
print_r($merged);
// Output:
// Array
// (
// [0] => 1
// [1] => 2
// [2] => 3
// [3] => 4
// [4] => 5
// )
// array_slice - ambil potongan
$numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
$middle = array_slice($numbers, 3, 4); // mulai index 3, ambil 4 elemen
print_r($middle);
// Output:
// Array
// (
// [0] => 3
// [1] => 4
// [2] => 5
// [3] => 6
// )
// array_slice tanpa length = sampai akhir
$tail = array_slice($numbers, 7);
print_r($tail);
// Output:
// Array
// (
// [0] => 7
// [1] => 8
// [2] => 9
// )
?>
Selisih dan Irisan
<?php
$lulus = ["Andi", "Budi", "Citra"];
$hadir = ["Budi", "Citra", "Dewi"];
// array_diff - ada di $lulus tapi tidak di $hadir
$tidakHadir = array_diff($lulus, $hadir);
print_r($tidakHadir);
// Output:
// Array
// (
// [0] => Andi
// )
// array_intersect - ada di kedua array
$duaDua = array_intersect($lulus, $hadir);
print_r($duaDua);
// Output:
// Array
// (
// [1] => Budi
// [2] => Citra
// )
// array_unique - hilangkan duplikat
$nilai = [80, 90, 80, 70, 90];
$unik = array_unique($nilai);
print_r($unik);
// Output:
// Array
// (
// [0] => 80
// [1] => 90
// [3] => 70
// )
?>
Menghitung dan Membalik
<?php
$scores = [80, 90, 75];
// array_sum - total semua nilai
echo array_sum($scores); // Output: 245
// Kombinasi untuk rata-rata
$average = array_sum($scores) / count($scores);
echo $average; // Output: 81.666666666667
// array_reverse - balik urutan
$rev = array_reverse([1, 2, 3]);
print_r($rev);
// Output:
// Array
// (
// [0] => 3
// [1] => 2
// [2] => 1
// )
// array_reverse dengan preserve_keys=true
$prices = ["apple" => 3, "banana" => 1];
$rev2 = array_reverse($prices, true);
print_r($rev2);
// Output:
// Array
// (
// [banana] => 1
// [apple] => 3
// )
?>
Common Mistakes
| Mistake | Contoh Salah | Kenapa Salah | Solusi |
|---|---|---|---|
Cek array_search() dengan == | if ($idx == false) | Index 0 dianggap sama dengan false | Gunakan !== false |
Lupa array_filter mempertahankan key | array_filter(...) lalu loop for | Key loncat (1, 3, 5...) | Bungkus dengan array_values() |
Mengharap sort() mengembalikan array | $sorted = sort($arr); | Sort mengubah array asli, return hanya true | Sort dulu, pakai variabel aslinya |
in_array tanpa strict untuk data string | in_array("1", [1,2,3]) | "1" cocok dengan 1 (loose) | Tambahkan argumen true |
array_map multi-array dengan panjang beda | hasil tidak sesuai harapan | Panjang hasil = array terpendek | Samakan panjang array dulu |
Exercise
- Gunakan
array_mapuntuk convert semua string ke uppercase - Gunakan
array_filteruntuk get products dengan harga > 100 - Gunakan
array_reduceuntuk calculate total dari cart - Buat function
sortByKey($array, $key)denganusort - Gabungkan
array_map+array_filter: filter angka genap, lalu kuadratkan hasilnya - Gunakan
array_diffuntuk mencari siswa yang tidak hadir dari dua array - Hitung rata-rata nilai dengan
array_sum()dancount(), lalu cari nilai tertinggi denganmax($scores)
Summary
| Function | Fungsi | Return |
|---|---|---|
array_map($fn, $arr) | Terapkan function ke tiap elemen | Array baru (sama panjang) |
array_filter($arr, $fn) | Simpan elemen yang lolos kondisi | Array baru (key dipertahankan) |
array_reduce($arr, $fn, $init) | Akumulasi jadi satu nilai | Satu nilai |
array_search($v, $arr) | Cari key dari nilai | Key atau false |
in_array($v, $arr, $strict) | Cek nilai ada | bool |
array_keys($arr, $v) | Semua key yang menyimpan nilai $v | Array of keys |
sort() / rsort() | Urut naik/turun, re-index | Modifikasi asli |
asort() / arsort() | Urut by value, key dipertahankan | Modifikasi asli |
ksort() / krsort() | Urut by key | Modifikasi asli |
usort($arr, $fn) | Urut dengan aturan custom | Modifikasi asli |
array_merge($a, $b) | Gabung array | Array baru |
array_slice($arr, $off, $len) | Potong bagian array | Array baru |
array_diff($a, $b) | Elemen $a yang tidak ada di $b | Array baru |
array_intersect($a, $b) | Elemen yang ada di keduanya | Array baru |
array_unique($arr) | Hilangkan duplikat | Array baru |
array_sum($arr) | Total semua nilai | Angka |
array_reverse($arr) | Balik urutan | Array baru |
Klik tombol ini setelah menyelesaikan materi
Quiz Bab 5
Uji pemahamanmu tentang Array