Mengenal array_filter, array_map dan array_reduce pada PHP
Assalamu’alaikum, pada kesempatan kali ini saya ingin mengenalkan penggunaan fungsi array_filter
,
array_map
dan array_reduce
untuk mengolah data array. Biasanya kita mengolah data array dengan cara lama
yaitu dengan fungsi for
atau foreach
digabung dengan if
untuk kondisinya. Nah kali ini saya akan
menggunakan fungsi array_[filter|map|reduce]
. Kita akan lihat kelebihan menggunakan cara ini.
array_filter
Pertama saya akan mendemokan dengan fungsi array_filter
dulu, fungsi ini berguna untuk menyaring data array.
Misalnya kita punya data user yang berisi id, name dan group_id dan kita ingin menyaringnya berdasarkan idnya.
Kita lihat dulu cara lamanya
class User
{
public $id;
public $name;
public $group_id;
public function __construct($id, $name, $group_id = 2)
{
$this->id = $id;
$this->name = $name;
$this->group_id = $group_id;
}
}
$users = [
new User(1, 'admin', 1),
new User(2, 'editor'),
new User(3, 'author')
];
$admins = [];
foreach ($users as $user) {
if ($user->group_id == 1) {
$admins[] = $user;
}
}
Dengan menggunakan fungsi array_filter
kita bisa mengurangi side efek samping dari fungsi.
$admins = array_filter($data, fn($user) => $user->group_id == 1);
Contoh lain mencari deret angka genap
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
$even = array_filter($numbers, fn($num) => $num % 2 == 0);
array_map
array_map
berguna untuk menerapkan fungsi ke sebuah data array. Misalnya kita punya data array angka
dan kita ingin mengkalikan tiap data tersebut dengan 2.
$numbers = [1, 2, 3, 4];
$multiple = array_map(fn($x) => $x * 2, $numbers);
Contoh lain misalnya kita punya data berupa daftar nama dan ingin dirapikan huruf besar kecil.
$names = ['agus', 'BuDI', 'nurHayati', 'Adi wijaya'];
$filteredNames = array_map(function ($name) {
$lowerName = strtolower($name);
return ucwords($lowerName);
}, $names);
array_reduce
Array reduce tidak hanya merubah jumlah elemen tetapi juga merubah data
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
$odd = array_reduce($numbers, function ($acc, $num) {
if ($num % 2 == 1) {
$acc[] = $num * 2;
}
return $acc;
}, []);
Kelebihan dari penggunaan fungsi array_filter, array_map dan array_reduce adalah kita menerapkan salah satu prinsip pemrograman fungsional yaitu tidak merubah data asli. Tidak merubah data asli berarti tidak menimbulkan efek samping. Untuk lebih memahami apa efek samping mari kita lihat fungsi sederhana berikut ini:
function add($x) {
return $x + $number;
}
Fungsi add di atas memiliki efek samping karena variabel $number
berada diluar fungsi ataupun tidak ada diparameter fungsi yang mengakibatkan
nilai yang tidak tentu jika menerapkan tes terhadap fungsi tersebut. Agar fungsi add tidak memiliki efek samping maka kita harus menaruh variabel
$number
sebagai parameter fungsi.
function add($x, $number) {
return $x + $number;
}
dengan menaruh parameter $number
sebagai argumen fungsi maka fungsi add akan selalu menghasilkan nilai yang sama jika kita mentesnya. misal kita
berikan nilai 1 pada $x
dan 2 pada $number
maka hasilnya akan selalu 3 karena fungsi tersebut tidak memiliki side effect atau lebih dikenal dengan istilah
pure function
. Walaupun PHP sendiri bukan merupakan bahasa pemrograman fungsional.