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.