Sắp xếp theo thứ tự tự nhiên
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 24 trên 68.
Dù các hàm sắp xếp tiêu chuẩn của PHP hoạt động tốt trong hầu hết trường hợp, chúng có thể cho kết quả không như mong đợi khi sắp xếp chuỗi chứa số. Hàm natsort() giải quyết vấn đề này bằng cách dùng thuật toán “sắp xếp tự nhiên”, giúp sắp xếp chuỗi theo cách mà mọi người thường mong đợi.
Hãy xem ví dụ này với tên tệp:
<?php
$files = ["file1.txt", "file10.txt", "file2.txt", "file20.txt"];
// sort() thông thường cho ra: file1.txt, file10.txt, file2.txt, file20.txt
sort($files);
print_r($files);
// Đặt lại mảng
$files = ["file1.txt", "file10.txt", "file2.txt", "file20.txt"];
// natsort() cho ra: file1.txt, file2.txt, file10.txt, file20.txt
natsort($files);
print_r($files);
?>Sự khác biệt này rất quan trọng: sort() thông thường so sánh chuỗi theo từng ký tự, nên "file10.txt" đứng trước "file2.txt" vì "1" đứng trước "2" trong ASCII. Tuy nhiên, natsort() nhận diện các phần số và sắp xếp chúng theo giá trị số, đặt "file2.txt" trước "file10.txt" như bạn thường mong đợi.
Giống như các hàm sắp xếp khác của PHP, natsort() sửa đổi trực tiếp mảng ban đầu. Điều này đặc biệt hữu ích khi sắp xếp danh sách tệp, số phiên bản hoặc dữ liệu có chuỗi chứa số cần được sắp xếp theo giá trị số thay vì theo thứ tự bảng chữ cái.
Thử thách
DễBạn sẽ nhận một đầu vào: một mảng số phiên bản phần mềm ở định dạng JSON. Đọc đầu vào, chuyển chuỗi JSON thành một mảng, dùng natsort() để sắp xếp số phiên bản theo thứ tự tự nhiên, rồi in ra 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 chuỗi phiên bản (ví dụ: ["v1.10","v1.2","v1.20","v1.3"])
Đầu ra mong đợi: Mảng đã sắp xếp theo thứ tự tự nhiên, hiển thị bằng print_r()
Tự làm thử
<?php
// Đọc đầu vào
$input = fgets(STDIN);
// Chuyển chuỗi JSON thành mảng
$versions = (array)json_decode($input, true);
// TODO: Viết code bên dưới để sắp xếp mảng bằng natsort()
// In ra mảng đã sắp xếp
print_r($versions);
?>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