Sắp xếp tùy chỉnh bằng 'usort'
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 25 trên 68.
Khi các hàm sắp xếp tích hợp sẵn của PHP không đáp ứng nhu cầu cụ thể của bạn, hàm usort() mang lại sự linh hoạt tối đa, cho phép bạn xác định chính xác cách so sánh và sắp xếp các phần tử. Hàm này nhận mảng của bạn và một hàm so sánh tùy chỉnh do bạn viết để xác định logic sắp xếp.
Hàm so sánh (comparison function) nhận hai phần tử từ mảng và phải trả về một số nguyên: số âm nếu phần tử đầu tiên nên đứng trước phần tử thứ hai, số 0 nếu chúng bằng nhau hoặc số dương nếu phần tử đầu tiên nên đứng sau phần tử thứ hai.
<?php
function compareByLength($a, $b) {
return strlen($a) - strlen($b);
}
$words = ["elephant", "cat", "butterfly", "dog"];
usort($words, "compareByLength");
print_r($words);
// Đầu ra: Array ( [0] => cat [1] => dog [2] => elephant [3] => butterfly )
?>Trong ví dụ này, hàm so sánh (function) tính độ chênh lệch giữa độ dài của các chuỗi. Khi strlen($a) - strlen($b) trả về một số âm, điều đó có nghĩa là chuỗi thứ nhất ngắn hơn và nên đứng trước trong mảng đã sắp xếp.
Giống các hàm sắp xếp khác trong PHP, usort() sửa đổi trực tiếp mảng ban đầu. Hàm mạnh mẽ này mở ra nhiều khả năng sắp xếp theo bất kỳ tiêu chí nào bạn có thể nghĩ đến, chẳng hạn như độ dài chuỗi, logic nghiệp vụ tùy chỉnh hoặc so sánh phức tạp trên nhiều trường.
Thử thách
DễBạn sẽ nhận một đầu vào: mảng giá sản phẩm ở định dạng JSON. Đọc đầu vào, chuyển chuỗi JSON thành mảng, tạo một hàm so sánh để sắp xếp giá theo thứ tự tăng dần, dùng usort() cùng hàm so sánh để sắp xếp mảng, rồi in mảng đã sắp xếp bằng print_r().
Định dạng đầu vào: Một dòng chứa mảng JSON gồm các số (ví dụ: [29.99,15.50,42.00,8.75,33.25])
Đầu ra mong đợi: Mảng đã sắp xếp theo giá theo thứ tự tăng dần, hiển thị bằng print_r()
Tự làm thử
<?php
// Đọc đầu vào
$input = fgets(STDIN);
$prices = json_decode($input, true);
// TODO: Tạo hàm (function) so sánh và dùng usort() để sắp xếp mảng
// In ra mảng đã sắp xếp
print_r($prices);
?>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ạngTự luyện tập: Trình biên dịch PHP online