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.
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,PhoặcM(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;
?>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
1Hàm nâng cao
Hàm ẩn danhClosure và 'use'Hàm mũi tênHàm callbackDùng 'call_user_func'Hàm biếnTruyền tham chiếuHàm đệ quyÔn tập: tổng hợp về hàm4Mảng đa chiều
Tạo mảng 2 chiềuTruy cập phần tử trong mảng 2 chiềuChỉnh sửa phần tử trong mảng 2 chiềuLặp qua các vòng lặp lồng nhauMảng kết hợp 2 chiềuÔn tập: bài tập lưới đơn giản2Thao tác nâng cao với mảng
Thêm phần tử bằng 'array_push'Xóa phần tử bằng 'array_pop'Thêm phần tử vào đầu mảng bằng 'array_unshift'Xóa phần tử đầu mảng bằng 'array_shift'Gộp các mảng được đánh chỉ sốGộp các mảng kết hợpTrích xuất phần tử bằng 'array_slice'Kiểm tra giá trị bằng 'in_array'Tìm khóa bằng 'array_search'Ôn tập: bài tập về danh sách phát3Sắp xếp mảng
Sắp xếp mảng có chỉ số tăng dầnSắp xếp mảng có chỉ số giảm dầnSắp xếp mảng kết hợp theo giá trịSắp xếp mảng kết hợp theo khóaSắp xếp theo thứ tự tự nhiênSắp xếp tùy chỉnh bằng 'usort'Ôn tập: Sắp xếp bảng xếp hạng6Các hàm mảng bậc cao
Biến đổi bằng 'array_map''array_map' với hàm tùy chỉnhLọc bằng 'array_filter''array_filter' với hàm tùy chỉnhRút gọn bằng 'array_reduce'Duyệt bằng 'array_walk'Ôn tập: xử lý dữ liệuTự luyện tập: Trình biên dịch PHP online