Website bị dính link xấu, link bẩn
Sắp xếp mảng PHP theo khóa key là gì?
Như với hầu hết các triển khai mảng, các mục trong mảng PHP có các chỉ mục để có thể truy cập các giá trị của chúng. Các chỉ mục thuộc loại số hoặc chuỗi. Do đó, sắp xếp một mảng theo khóa là một nhiệm vụ liên quan đến việc sắp xếp một mảng PHP bằng cách đánh giá các thuộc tính của các khóa của nó. PHP cung cấp các hàm giúp sắp xếp mảng theo khóa hiệu quả.

Các hàm phổ biến ksort và krsort
Các hàm ksort và krsort cho phép sắp xếp các khóa mảng và chuyển tiếp các phần tử mảng theo thứ tự tăng dần và giảm dần tương ứng. Đối với các mảng có khóa chuỗi, các hàm ksort và krsort tạo ra thứ tự khóa theo thứ tự bảng chữ cái và ngược bảng chữ cái tương ứng. Với một chức năng tùy chỉnh như customSort trong đoạn mã để theo dõi, có thể trừu tượng hóa việc sử dụng các chức năng sắp xếp khóa mảng đã xác định trước.
Ví dụ:
<?php
function customSort(array $list, bool $asc = true): array
{
$asc ? ksort($list) : krsort($list);
return $list;
}
$numeric = [
12 => 'baz',
2 => 'foo',
5 => 'bar',
];
$assoc = [
'foo' => 'foo',
'baz' => 'baz',
'bar' => 'bar',
];
var_dump(
customSort($assoc), // sort ascending (A-Z)
customSort($assoc, false), // sort descending (Z-A)
customSort($numeric), // sort ascending (2,5,12)
customSort($numeric, false), // sort descending (12,5,2)
);
?>
Kết quả in ra sẽ là:
1. customSort($assoc) (ascending):
array(3) {
["bar"]=> string(3) "bar"
["baz"]=> string(3) "baz"
["foo"]=> string(3) "foo"
}
2. customSort($assoc, false) (descending):
array(3) {
["foo"]=> string(3) "foo"
["baz"]=> string(3) "baz"
["bar"]=> string(3) "bar"
}
3. customSort($numeric) (ascending):
array(3) {
[2]=> string(3) "foo"
[5]=> string(3) "bar"
[12]=> string(3) "baz"
}
4. customSort($numeric, false) (descending):
array(3) {
[12]=> string(3) "baz"
[5]=> string(3) "bar"
[2]=> string(3) "foo"
}
Gợi ý nâng cao:
Nếu bạn muốn sắp xếp theogiá trị thay vì key
, bạn có thể mở rộng hàm:
function customSort(array $list, bool $asc = true, bool $byValue = false): array
{
if ($byValue) {
$asc ? asort($list) : arsort($list);
} else {
$asc ? ksort($list) : krsort($list);
}
return $list;
}
Hàm customSort sắp xếp các mảng theo khóa theo quyết định của người dùng theo thứ tự tăng dần hoặc giảm dần (thứ tự bảng chữ cái hoặc thứ tự ngược bảng chữ cái đối với dữ liệu chuỗi). Nó có hai đối số, một danh sách để sắp xếp và một cờ boolean để chỉ định thứ tự dự định (theo mặc định là tăng dần). Chữ ký của hàm customSort sao cho tùy thuộc vào lựa chọn của người dùng, nó sẽ gọi các hàm ksort hoặc krsort tương ứng và trả về một danh sách đã sắp xếp. Điều đáng chú ý là ksort và krsort không cấu thành biểu thức trả về vì chúng chỉ có thể gọi được bằng cách tham chiếu.
Ví dụ:
Sắp xếp các mảng kết hợp và mảng số, $assoc và $numeric, thông qua hàm customSort theo thứ tự tăng dần và giảm dần.
$assoc = [
"foo" => "foo",
"baz" => "baz",
"bar" => "bar",
];
ksort($assoc); // sort ascending by key
krsort($assoc); // sort descending by key
$numeric = [
5 => "bar",
2 => "foo",
12 => "baz",
];
ksort($numeric); // ascending key
krsort($numeric); // descending key
Chú thích một số hàm sort PHP
1. Sắp xếp $assoc theo key chữ cái tăng dần (ascending):
array(3) {
["bar"] => string(3) "bar"
["baz"] => string(3) "baz"
["foo"] => string(3) "foo"
}
2. Sắp xếp $assoc theo key chữ cái giảm dần (descending):
array(3) {
["foo"] => string(3) "foo"
["baz"] => string(3) "baz"
["bar"] => string(3) "bar"
}
3. Sắp xếp $numeric theo key số tăng dần (ascending):
array(3) {
[2] => string(3) "foo"
[5] => string(3) "bar"
[12] => string(3) "baz"
}
4. Sắp xếp $numeric theo key số giảm dần (descending):
array(3) {
[12] => string(3) "baz"
[5] => string(3) "bar"
[2] => string(3) "foo"
}
Hàm uksort
Một tùy chọn khác để sắp xếp một mảng PHP theo khóa là hàm uksort gốc. uksort đặc biệt hấp dẫn vì nó cho phép người dùng kiểm soát hoàn toàn các quy tắc sắp xếp không giống như ksort và krsort, mỗi quy tắc cung cấp một cách tiếp cận đơn lẻ để sắp xếp các khóa mảng. Thông qua chức năng gọi lại, có thể chỉ định nguyên tắc sắp xếp khóa mảng tùy ý. uksort, giống như các hàm trong phần trước, là một hàm chuyển qua tham chiếu không nên được gọi trong câu lệnh trả về của hàm bao bọc. Như với phần trước, một hàm tùy ý, được đặt tên là customSortCb cho phần này, sẽ đủ để chứng minh khả năng sắp xếp của uksort.
Ví dụ:
Đoạn mã dưới đây giới thiệu một ứng dụng đơn giản của thứ tự khóa mảng tùy ý.
<?php
function custom_sort_cb(array $list, callable $callback): array
{
uksort($list, $callback);
return $list;
}
$assoc = [
'food' => 'food',
'bass' => 'bass',
'battery' => 'battery',
];
var_dump(
custom_sort_cb(
$assoc,
fn($current, $next) => strncasecmp($current, $next, 3),
),
);
?>
Cách tiếp cận để viết trình bao bọc tùy chỉnh customSortCb giống như cách được sử dụng khi viết trình bao bọc trong phần trước. Logic sắp xếp trong hàm được truyền cho uksort có lẽ là phần hấp dẫn nhất của phân đoạn này. Theo đoạn mã trên, hàm mũi tên được chuyển đến customSortCb và cuối cùng, đến uksort thực hiện lặp lại phép so sánh nhị phân không phân biệt chữ hoa chữ thường giữa phần tử khóa hiện tại và phần tử khóa tiếp theo. Chỉ ba ký tự đầu tiên của mỗi khóa chứ không phải toàn bộ khóa được so sánh. Nếu tìm thấy khớp giữa khóa hiện tại và khóa tiếp theo, thì thứ tự được duy trì, nếu không, so sánh giữa kết quả dương tính của phép so sánh sẽ tạo ra thứ tự bảng chữ cái giống như trong đoạn mã bên dưới.
array(3) {
["bass"]=>
string(4) "bass"
["battery"]=>
string(7) "battery"
["food"]=>
string(4) "food"
}
Xem thê tại link: https://www.php.net/manual/en/function.ksort.php