PHP có sẵn một số hàm tính toán dựa trên giá trị các phần tử của mảng, ví dụ như:
array_sum
(tổng giá trị các phần tử trong một mảng)array_product
(tích giá trị các phần tử trong một mảng)
Trường hợp phức tạp hơn như tính tổng các số lẻ trong một mảng hoặc xử lý mảng chuỗi thì sao?
Reduce của PHP – array_reduce
array_reduce
trả về một giá trị duy nhất dựa trên mảng đầu vào thông qua một hàm callback
. Usage:
mixed array_reduce ( array $array , callable $callback [, mixed $initial = NULL ] )
Ví dụ 1:
Tính tổng các số lẻ trong một mảng int có sẵn
Dùng foreach
:
$numbers = [1, 2, 3, 4, 5]; $sumOfOdd = 0; foreach ($numbers as $number) { if ($number % 2 == 1) { $sumOfOdd += $number; } } var_dump($sumOfOdd); // 9
Dùng array_reduce
:
$numbers = [1, 2, 3, 4, 5]; $sumOfOdd = array_reduce($numbers, function ($carry, $value) { if ($value % 2 == 1) { return $carry + $value; } return $carry; }); var_dump($sumOfOdd); // 9
Ở ví dụ trên, $carry
được dùng như một biến tạm để lưu trữ giá trị tổng của các số lẻ. Cho nên khi $value
không thỏa mãn điều kiện thì ta vẫn phải return $carry
phục vụ cho phép tính tiếp theo.
Ví dụ 2:
Cho một mảng tên các loài động vật, in ra danh sách tên đó cách nhau bởi dấu gạch ngang
-
Dùng foreach
:
$animals = ['Dog', 'Cat', 'Horse']; $str = ''; foreach ($animals as $animal) { $str .= $animal . ' - '; } echo rtrim($str, ' - '); // Dog - Cat - Horse
Ở bên trên tôi phải dùng rtrim
để loại bỏ ký tự -
ở cuối cùng đi.
Dùng array_reduce
:
$animals = ['Dog', 'Cat', 'Horse']; $str = array_reduce($animals, function ($carry, $value){ if ($carry){ return $carry . ' - ' . $value; } return $value; }); echo $str; // Dog - Cat - Horse
Kết
Vậy là đã hết ba phần giới thiệu về map, filter và reduce – bộ ba không thể thiếu trong lập trình hàm bằng cách giới thiệu chúng qua… PHP 😆
Các ví dụ tôi đưa ra chỉ là những ví dụ cực kỳ đơn giản, chúng chưa thể hiện được hết ứng dụng của “bộ ba” nhưng cũng phần nào đủ dễ hiểu để mọi người có thể hình dung ra được cách hoạt động của chúng.
Để có thể ứng dụng được bộ ba này một cách thật nuột thì chỉ còn cách là dùng chúng thật nhiều, tuy nhiên cũng đừng quá lạm dụng. In fact, foreach
trong PHP vẫn dễ đọc hơn đối với tay ngang, nhiều khi code “hịn” lại khó hiểu hơn code bình thường 😆
hình như cái ví dụ 2 nó hơi dài anh ơi :3
“`$animals = [‘Dog’, ‘Cat’, ‘Horse’];
echo implode(‘ – ‘, $animals);“`
Ví dụ cho dễ hiểu thôi :v
Viết implode thì còn dùng array_reduce làm gì nữa =))