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

Map, filter và reduce với PHP – phần 3 – array_reduce 2

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  😆

5 1 vote
Article Rating