BAB 5: ARRAY

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
<?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
// )

?>
💡Tip

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:

📊 Memuat diagram…

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
<?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
// )

?>
⚠️Perhatian

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
<?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
<?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

?>
⚠️Perhatian

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
<?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
<?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

?>
💡Tip

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
<?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
}

?>
⚠️Perhatian

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
<?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)

?>
💡Tip

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
<?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.

FunctionArahKeyCocok untuk
sort()NaikRe-indexIndexed array
rsort()TurunRe-indexIndexed array
asort()NaikDipertahankanAssociative by value
arsort()TurunDipertahankanAssociative by value
ksort()NaikDipertahankanAssociative by key
krsort()TurunDipertahankanAssociative by key
usort()CustomRe-indexAturan sendiri
php
<?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
// )

?>
⚠️Perhatian

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
<?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
<?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
<?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

MistakeContoh SalahKenapa SalahSolusi
Cek array_search() dengan ==if ($idx == false)Index 0 dianggap sama dengan falseGunakan !== false
Lupa array_filter mempertahankan keyarray_filter(...) lalu loop forKey loncat (1, 3, 5...)Bungkus dengan array_values()
Mengharap sort() mengembalikan array$sorted = sort($arr);Sort mengubah array asli, return hanya trueSort dulu, pakai variabel aslinya
in_array tanpa strict untuk data stringin_array("1", [1,2,3])"1" cocok dengan 1 (loose)Tambahkan argumen true
array_map multi-array dengan panjang bedahasil tidak sesuai harapanPanjang hasil = array terpendekSamakan panjang array dulu

Exercise

  1. Gunakan array_map untuk convert semua string ke uppercase
  2. Gunakan array_filter untuk get products dengan harga > 100
  3. Gunakan array_reduce untuk calculate total dari cart
  4. Buat function sortByKey($array, $key) dengan usort
  5. Gabungkan array_map + array_filter: filter angka genap, lalu kuadratkan hasilnya
  6. Gunakan array_diff untuk mencari siswa yang tidak hadir dari dua array
  7. Hitung rata-rata nilai dengan array_sum() dan count(), lalu cari nilai tertinggi dengan max($scores)

Summary

FunctionFungsiReturn
array_map($fn, $arr)Terapkan function ke tiap elemenArray baru (sama panjang)
array_filter($arr, $fn)Simpan elemen yang lolos kondisiArray baru (key dipertahankan)
array_reduce($arr, $fn, $init)Akumulasi jadi satu nilaiSatu nilai
array_search($v, $arr)Cari key dari nilaiKey atau false
in_array($v, $arr, $strict)Cek nilai adabool
array_keys($arr, $v)Semua key yang menyimpan nilai $vArray of keys
sort() / rsort()Urut naik/turun, re-indexModifikasi asli
asort() / arsort()Urut by value, key dipertahankanModifikasi asli
ksort() / krsort()Urut by keyModifikasi asli
usort($arr, $fn)Urut dengan aturan customModifikasi asli
array_merge($a, $b)Gabung arrayArray baru
array_slice($arr, $off, $len)Potong bagian arrayArray baru
array_diff($a, $b)Elemen $a yang tidak ada di $bArray baru
array_intersect($a, $b)Elemen yang ada di keduanyaArray baru
array_unique($arr)Hilangkan duplikatArray baru
array_sum($arr)Total semua nilaiAngka
array_reverse($arr)Balik urutanArray baru

Klik tombol ini setelah menyelesaikan materi

📝

Quiz Bab 5

Uji pemahamanmu tentang Array