Php 7+
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
với chức năng ẩn danh sử dụng toán tử tàu vũ trụ để so sánh các yếu 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ó chức năng so sánh do người dùng cung cấp phải hoạt động như sau [từ 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ố đầu tiên được coi là nhỏ hơn, bằng hoặc lớn hơn thứ hai.
Và cũng lưu ý rằng , nhà điều 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ộ sự biện minh được đưa ra để thêm vào ngôn ngữ trong //wiki.php.net/rfc/combined-comparison-operator là nó
Làm cho việc viết các cuộc gọi lại đặt hàng để sử dụng với
usort[]
dễ dàng hơn
Php 5.3+
Php 5.3 đã giới thiệu các chức năng ẩ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 hơn một chút 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ù nó khá phổ biến đối với các bộ so sánh xử lý các giá trị số nguyên để chỉ trả về sự khác biệt của các giá trị, như ____10, 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à số điểm nổi trong ví dụ của người hỏi câu hỏi, nhưng chức năng so sánh mà chúng tôi chuyển đến usort
phải trả lại số nguyên cho usort
để hoạt động đúng:
Trả về các giá trị không định số từ hàm so sánh, chẳng hạn như float, sẽ dẫn đến một diễn viên nội bộ cho số nguyên của giá trị trả về của cuộc 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ị số nguyên là 0, sẽ so sánh các giá trị như bằng nhau.non-integer values from the comparison function, such as float, will result in an internal cast to integer of the callback's return value. So values such as 0.99 and 0.1 will both be cast to an integer value of 0, which will compare such values as equal.
Đâ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 tôi về câu trả lời này đã gây ra sai lầm này và tôi đã tích lũy được mười phần trăm trên hàng ngàn lượt xem rõ ràng mà không có ai nhận thấy lỗi nghiêm trọng. Sự dễ dàng mà các thiếu hụt như tôi có thể làm hỏng các hàm 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.
Làm thế nào chúng ta có thể sắp xếp một mảng mà không cần sử dụng phương thức sắp xếp trong PHP?
hàm php sortArray [] {$ inputArray = mảng [8, 2, 7, 4, 5]; $ outArray = mảng []; cho [$ x = 1; $ x
- PHP có một số chức năng liên quan đến việc sắp xếp các mảng và tài liệu này tồn tại để giúp sắp xếp tất cả.array keys, whereas others by the values:
4usort[$inventory, function [$item1, $item2] { return $item2['price'] $item1['price']; }];
- Sự khác biệt chính là:
- Một số loại dựa trên các phím mảng, trong khi các khóa khác theo các giá trị:
4usort[$inventory, function [$item1, $item2] { return $item2['price'] $item1['price']; }];
- Có hay không mối tương quan giữa các khóa và giá trị được duy trì sau khi sắp xếp, có thể có nghĩa là các khóa được đặt lại bằng số [0,1,2 ...]
- Thứ tự của loại: bảng chữ cái, tăng dần [thấp đến cao], giảm dần [cao đến thấp], tự nhiên, ngẫu nhiên hoặc người dùng được xác định
array_multisort[] | giá trị | Thứ tự sắp xếp keys yes, int keys no | Các chức năng liên quan | array_walk[] |
asort[] | giá trị | Vâng | đã xác định người dùng | arsort[] |
arsort[] | giá trị | Vâng | đã xác định người dùng | asort[] |
krsort[] | Chìa khóa | Vâng | đã xác định người dùng | ksort[] |
ksort[] | Chìa khóa | Vâng | đã xác định người dùng | krsort[] |
natcasesort[] | giá trị | Vâng | đã xác định người dùng | natsort[] |
natsort[] | giá trị | Vâng | đã xác định người dùng | natcasesort[] |
rsort[] | giá trị | Chìa khóa | đã xác định người dùng | sort[] |
shuffle[] | giá trị | Chìa khóa | không | array_rand[] |
sort[] | giá trị | Chìa khóa | đã xác định người dùng | rsort[] |
uasort[] | giá trị | Vâng | đã xác định người dùng | uksort[] |
uksort[] | Chìa khóa | Vâng | đã xác định người dùng | uasort[] |
usort[] | giá trị | Chìa khóa | đã xác định người dùng | uasort[] |
Chìa khóa ¶
không
usort[$inventory, function [$item1, $item2] {
return $item2['price'] $item1['price'];
}];
5usort[$inventory, function [$item1, $item2] {
return $item2['price'] $item1['price'];
}];
6usort[$inventory, function [$item1, $item2] {
return $item2['price'] $item1['price'];
}];
7usort[$inventory, function [$item1, $item2] {
return $item2['price'] $item1['price'];
}];
8usort[$inventory, function [$item1, $item2] {
return $item2['price'] $item1['price'];
}];
9usort[$inventory, function [$item1, $item2] {
if [$item1['price'] == $item2['price']] return 0;
return $item1['price'] < $item2['price'] ? -1 : 1;
}];
0usort[$inventory, function [$item1, $item2] {
if [$item1['price'] == $item2['price']] return 0;
return $item1['price'] < $item2['price'] ? -1 : 1;
}];
1" Matthew Rice " ¶ ¶
9 năm trước
usort[$inventory, function [$item1, $item2] {
if [$item1['price'] == $item2['price']] return 0;
return $item1['price'] < $item2['price'] ? -1 : 1;
}];
2usort[$inventory, function [$item1, $item2] {
if [$item1['price'] == $item2['price']] return 0;
return $item1['price'] < $item2['price'] ? -1 : 1;
}];
3usort[$inventory, function [$item1, $item2] {
if [$item1['price'] == $item2['price']] return 0;
return $item1['price'] < $item2['price'] ? -1 : 1;
}];
1oculiz tại gmail dot com ¶ ¶
11 năm trước
usort[$inventory, function [$item1, $item2] {
if [$item1['price'] == $item2['price']] return 0;
return $item1['price'] < $item2['price'] ? -1 : 1;
}];
5usort[$inventory, function [$item1, $item2] {
if [$item1['price'] == $item2['price']] return 0;
return $item1['price'] < $item2['price'] ? -1 : 1;
}];
6usort[$inventory, function [$item1, $item2] {
if [$item1['price'] == $item2['price']] return 0;
return $item1['price'] < $item2['price'] ? -1 : 1;
}];
1