array_map($callback, $array) memanggil $callback pada setiap elemen $array dan mengembalikan array baru berisi hasilnya. Callback ditulis lebih dulu, array kedua, dan array aslinya tidak berubah.
fn($p) => $p * 1.2 adalah arrow function: fungsi berisi satu ekspresi yang langsung mengembalikan hasilnya. Callable apa pun bisa dipakai di tempatnya.
Memakai fungsi bawaan sebagai callback
Berikan nama fungsi bawaan sebagai string. Ini cara terpendek untuk merapikan seluruh array: memangkas spasi setiap nilai, mengubah string menjadi integer, atau mengubah huruf besar kecil.
array_map('intval', ...) adalah cara biasa untuk mengubah string dari formulir atau explode() menjadi integer sungguhan. Kamu juga bisa menulis intval(...), sintaks first-class callable dari PHP 8.1, yang bisa dilengkapi otomatis dan diperiksa oleh editormu.
Memakai closure dengan variabel dari luar
Arrow function otomatis melihat variabel di sekitarnya. function klasik butuh use untuk membawanya masuk. Keduanya dijelaskan di halaman fungsi anonim.
array_map dengan key
Dengan satu array, array_map mempertahankan key-nya, termasuk key string. Tetapi callback hanya menerima nilainya. Untuk mendapatkan key juga, berikan array_keys($array) sebagai array kedua: callback lalu dipanggil dengan satu elemen dari setiap array.
Perhatikan hasil kedua: begitu kamu memberikan lebih dari satu array, key-nya diganti dengan 0, 1, 2. Karena itulah baris terakhir memakai array_combine() untuk menyusunnya kembali.
Memetakan beberapa array sekaligus
Setiap array tambahan menjadi argumen tambahan untuk callback, dipasangkan menurut posisinya. Kalau panjang array-nya berbeda, array yang lebih pendek diisi dengan null.
Memberikan null sebagai callback akan melewati fungsinya dan menggabungkan array-array itu menjadi pasangan:
array_map vs array_walk vs foreach
array_map membuat array baru. array_walk mengubah array yang kamu berikan, lewat referensi, dan memberi callback key sebagai argumen keduanya. foreach bisa melakukan keduanya, dan juga bisa melewati elemen atau berhenti lebih awal dengan break.
Pakai array_map saat setiap elemen berubah menjadi tepat satu elemen baru. Kalau kamu juga perlu membuang sebagian elemen, gabungkan dengan array_filter, atau tulis foreach.
Kesalahan umum: urutan argumen
array_map menerima callback lebih dulu dan array kedua. Tetangganya, array_filter, menerima keduanya dengan urutan terbalik, sehingga mudah tertukar:
array_map($callback, $array); // callback first
array_filter($array, $callback); // array first
Kalau keduanya ditukar, PHP 8 melempar TypeError, karena array biasa bukan callback yang valid:
PHP berhenti dengan:
PHP Fatal error: Uncaught TypeError: array_map(): Argument #1 ($callback) must be a valid callback or null, array callback must have exactly two members in /home/index.php:4
Tukar kembali kedua argumennya, dan blok itu akan berjalan.
Pertanyaan yang sering diajukan
Apa fungsi array_map di PHP?
Fungsi ini memanggil sebuah fungsi pada setiap elemen array dan mengembalikan array baru berisi hasilnya: array_map(fn($n) => $n * 2, [1, 2, 3]) mengembalikan [2, 4, 6]. Array aslinya tidak berubah.
Apakah array_map mempertahankan key?
Dengan satu array, ya: key string dan integer tetap seperti semula. Dengan dua array atau lebih, hasilnya selalu mendapat key baru 0, 1, 2....
Bagaimana cara mendapatkan key di dalam callback array_map?
Berikan key-nya sebagai array kedua: array_map(fn($k, $v) => "$k=$v", array_keys($arr), $arr). Hasilnya berupa list, jadi bungkus dengan array_combine(array_keys($arr), ...) kalau kamu butuh key aslinya kembali.
Apakah array_map lebih cepat daripada foreach?
Tidak secara berarti. Keduanya menelusuri array satu kali, dan foreach biasa sering sedikit lebih cepat karena tidak memanggil fungsi untuk setiap elemen. Pilih array_map saat kodenya lebih mudah dibaca: satu transformasi yang menghasilkan array baru.
Apa bedanya array_map dan array_walk?
array_map mengembalikan array baru dan tidak menyentuh input-nya. array_walk mengembalikan true dan dimaksudkan untuk mengubah array secara langsung lewat parameter referensi: array_walk($arr, function (&$v, $k) { $v = trim($v); });.