Menu
CoddyTech

Rút gọn bằng 'array_reduce'

Thuộc phần Logic và luồng chương trình trong hành trình PHP của Coddy. Bài học 43 trên 68.

Hàm (function) array_reduce() có cách tiếp cận khác với array_map() và array_filter(). Thay vì trả về một mảng mới, hàm này xử lý tất cả phần tử trong một mảng để tạo ra một giá trị duy nhất. Điều này khiến hàm rất phù hợp với các thao tác như tính tổng, tìm giá trị lớn nhất hoặc kết hợp tất cả phần tử thành một kết quả.

Hàm (function) nhận mảng cần xử lý và một hàm callback xác định cách kết hợp các phần tử, cùng với tham số thứ ba không bắt buộc: giá trị ban đầu. Hàm callback nhận hai tham số: kết quả tích lũy (gọi là "carry") và phần tử hiện tại của mảng.

<?php
function addNumbers($carry, $item) {
    return $carry + $item;
}

$numbers = [1, 2, 3, 4, 5];
$sum = array_reduce($numbers, "addNumbers", 0);
// Kết quả: 15
?>

Trong ví dụ này, hàm bắt đầu với giá trị ban đầu là 0, sau đó liên tục gọi addNumbers với tổng đang có và từng phần tử của mảng. Quá trình tích lũy này tiếp tục cho đến khi xử lý hết tất cả phần tử, để lại cho bạn giá trị cuối cùng sau khi rút gọn.

challenge icon

Thử thách

Dễ

Bạn sẽ nhận hai đầu vào: một danh sách số được phân tách bằng dấu phẩy và một loại phép toán. Đầu vào thứ nhất chứa các số dưới dạng chuỗi theo định dạng 5,10,15,20,25, còn đầu vào thứ hai là một ký tự duy nhất biểu thị phép toán: S để tính tổng, P để tính tích hoặc M để tìm giá trị lớn nhất.

Đọc cả hai đầu vào, chuyển các số được phân tách bằng dấu phẩy thành một mảng số nguyên, tạo một hàm callback tùy chỉnh để thực hiện phép toán đã chỉ định, dùng array_reduce() với hàm callback của bạn và giá trị khởi tạo phù hợp để xử lý tất cả các số thành một kết quả duy nhất, rồi in ra kết quả cuối cùng.

Chi tiết về phép toán:

  • S (Tổng): Cộng tất cả các số lại với nhau (giá trị khởi tạo: 0)
  • P (Tích): Nhân tất cả các số với nhau (giá trị khởi tạo: 1)
  • M (Giá trị lớn nhất): Tìm số lớn nhất (giá trị khởi tạo: số đầu tiên trong mảng hoặc một số rất nhỏ)

Hàm callback của bạn cần nhận hai tham số: kết quả đã tích lũy (carry) và phần tử hiện tại của mảng (item), sau đó trả về giá trị tích lũy đã cập nhật dựa trên loại phép toán.

Định dạng đầu vào:

  • Dòng thứ nhất: Các số được phân tách bằng dấu phẩy (ví dụ: 5,10,15,20,25)
  • Dòng thứ hai: Loại phép toán, có thể là S, P hoặc M (ví dụ: S)

Đầu ra mong đợi: Một số duy nhất biểu thị kết quả của phép toán reduce

Tự làm thử

<?php
// Đọc đầu vào
$numbers_input = trim(fgets(STDIN));
$operation = trim(fgets(STDIN));

// Chuyển chuỗi phân tách bằng dấu phẩy thành mảng số nguyên
$numbers = array_map('intval', explode(',', $numbers_input));

// TODO: Viết code bên dưới
// Tạo hàm callback dựa trên loại phép toán
// Dùng array_reduce() với hàm callback và giá trị ban đầu phù hợp


// Xuất kết quả
echo $result;
?>
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng chương trình

Tự luyện tập: Trình biên dịch PHP online