7+ PHP
Kể từ PHP 7, điều này có thể được thực hiện chính xác bằng cách sử dụng usort
một hàm ẩn danh sử dụng toán tử tàu vũ trụ để so sánh các phần tử.
Bạn có thể thực hiện một loại tăng dần như thế này:
usort($inventory, function ($item1, $item2) {
return $item1['price'] <=> $item2['price'];
});
Hoặc một loại giảm dần như thế này:
usort($inventory, function ($item1, $item2) {
return $item2['price'] <=> $item1['price'];
});
Để hiểu cách thức hoạt động của nó, lưu ý rằng usort
có một hàm so sánh do người dùng cung cấp phải hoạt động như sau (từ các tài liệu):
Hàm so sánh phải trả về một số nguyên nhỏ hơn, bằng hoặc lớn hơn 0 nếu đối số thứ nhất được coi là tương ứng nhỏ hơn, bằng hoặc lớn hơn số thứ hai.
Và cũng lưu ý rằng <=>
, người vận hành tàu vũ trụ,
trả về 0 nếu cả hai toán hạng đều bằng nhau, 1 nếu bên trái lớn hơn và -1 nếu bên phải lớn hơn
đó chính xác là những gì usort
cần. Trên thực tế, gần như toàn bộ lời biện minh được đưa ra để thêm <=>
vào ngôn ngữ trong https://wiki.php.net/rfc/combined-comparison-operator là nó
làm cho văn bản gọi lại để sử dụng usort()
dễ dàng hơn
PHP 5.3 trở lên
PHP 5.3 đã giới thiệu các hàm ẩn danh, nhưng chưa có toán tử tàu vũ trụ. Chúng ta vẫn có thể sử dụng usort
để sắp xếp mảng của mình, nhưng nó dài dòng hơn và khó hiểu hơn:
usort($inventory, function ($item1, $item2) {
if ($item1['price'] == $item2['price']) return 0;
return $item1['price'] < $item2['price'] ? -1 : 1;
});
Lưu ý rằng mặc dù khá phổ biến đối với các bộ so sánh xử lý các giá trị nguyên để trả về sự khác biệt của các giá trị, như $item2['price'] - $item1['price']
, chúng ta không thể làm điều đó một cách an toàn trong trường hợp này. Điều này là do giá là các số dấu phẩy động trong ví dụ của người hỏi, nhưng hàm so sánh chúng ta chuyển qua usort
phải trả về số nguyên usort
để hoạt động chính xác:
Trả về các giá trị không nguyên từ hàm so sánh, chẳng hạn như float, sẽ dẫn đến việc truyền nội bộ thành số nguyên của giá trị trả về của hàm gọi lại. Vì vậy, các giá trị như 0,99 và 0,1 sẽ được chuyển thành giá trị nguyên bằng 0, sẽ so sánh các giá trị đó bằng nhau.
Đây là một cái bẫy quan trọng cần lưu ý khi sử dụng usort
trong PHP 5.x! Phiên bản gốc của câu trả lời này đã mắc lỗi này và tôi đã tích lũy được mười lượt tán thành qua hàng ngàn lượt xem mà không ai nhận ra lỗi nghiêm trọng. Sự dễ dàng mà những người thiếu như tôi có thể làm hỏng các chức năng so sánh chính xác là lý do mà toán tử tàu vũ trụ dễ sử dụng hơn đã được thêm vào ngôn ngữ trong PHP 7.