'array_map' với hàm tùy chỉnh
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 40 trên 68.
Các hàm có sẵn như strtoupper hoạt động tốt với array_map(), nhưng sức mạnh thực sự đến từ việc dùng các hàm tùy chỉnh của riêng bạn. Nhờ đó, bạn có thể tạo các phép biến đổi cụ thể phù hợp chính xác với nhu cầu của mình.
Để dùng một hàm tùy chỉnh với array_map(), bạn chỉ cần truyền tên hàm dưới dạng chuỗi cho tham số đầu tiên. Hàm tùy chỉnh của bạn nên nhận một tham số (phần tử hiện tại của mảng) và trả về giá trị đã được chuyển đổi.
<?php
function doubleNumber($num) {
return $num * 2;
}
$numbers = [1, 2, 3, 4, 5];
$doubled = array_map("doubleNumber", $numbers);
// Kết quả: [2, 4, 6, 8, 10]
?>Cách tiếp cận này giúp bạn kiểm soát hoàn toàn cách xử lý từng phần tử. Bạn có thể thực hiện các phép tính phức tạp, thao tác chuỗi hoặc bất kỳ logic nào khác bên trong hàm tùy chỉnh, nhờ đó array_map() trở nên vô cùng linh hoạt khi chuyển đổi dữ liệu.
Thử thách
DễBạn sẽ nhận hai đầu vào: một danh sách nhiệt độ Celsius được phân tách bằng dấu phẩy và một đơn vị đích để chuyển đổi, có thể là F cho Fahrenheit hoặc K cho Kelvin. Đầu vào thứ nhất chứa nhiệt độ dưới dạng chuỗi theo định dạng 0,10,20,30,100, còn đầu vào thứ hai là một ký tự cho biết kiểu chuyển đổi.
Đọc cả hai đầu vào, chuyển các nhiệt độ được phân tách bằng dấu phẩy thành một mảng số, tạo một hàm (function) tùy chỉnh để chuyển đổi nhiệt độ Celsius sang đơn vị đích, dùng array_map() cùng hàm tùy chỉnh để chuyển đổi tất cả nhiệt độ, rồi in từng nhiệt độ đã chuyển đổi trên một dòng riêng, làm tròn đến 2 chữ số thập phân.
Công thức chuyển đổi:
- Celsius sang Fahrenheit:
(C × 9/5) + 32 - Celsius sang Kelvin:
C + 273.15
Định dạng đầu vào:
- Dòng thứ nhất: Các nhiệt độ Celsius được phân tách bằng dấu phẩy (ví dụ:
0,10,20,30,100) - Dòng thứ hai: Đơn vị chuyển đổi đích, có thể là
FhoặcK(ví dụ:F)
Đầu ra mong đợi: In từng nhiệt độ đã chuyển đổi trên một dòng riêng, làm tròn đến 2 chữ số thập phân
Tự làm thử
<?php
// Đọc các nhiệt độ được phân tách bằng dấu phẩy
$temperatures = fgets(STDIN);
// Đọc đơn vị đích (F hoặc K)
$unit = trim(fgets(STDIN));
// Chuyển chuỗi các nhiệt độ được phân tách bằng dấu phẩy thành mảng số
$tempArray = explode(',', trim($temperatures));
// TODO: Viết code của bạn bên dưới
// Tạo hàm (function) tùy chỉnh để chuyển từ độ C sang đơn vị đích
// Dùng array_map() để chuyển đổi tất cả nhiệt độ
// In mỗi nhiệt độ đã chuyển đổi trên một dòng riêng, làm tròn đến 2 chữ số thập phân
?>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