Sắp xếp mảng PHP theo khóa key là gì?

Sắp xếp là một cách tiếp cận theo thuật toán để đặt các thành phần của mảng theo thứ tự nào đó. Tất cả các cấu trúc dữ liệu tuyến tính ở các ngôn ngữ lập trình có thể được sắp xếp tùy ý: Mảng PHP cũng không ngoại lệ. Mảng PHP cho phép tồn tại mảng hỗn hợp, có lẽ là cấu trúc dữ liệu hỗn hợp tinh túy của ngôn ngữ này. Nó là một tạo tác động có thể được sử dụng như một mảng số truyền thống, mảng kết hợp, mảng đa chiều hoặc bất kỳ sự kết hợp nào của các tùy chọn được đề cập ở trên. Giống như phần còn lại của ngôn ngữ, cấu trúc mảng của PHP đã phát triển đều đặn qua nhiều lần lặp lại để mang lại hiệu suất tốt nhất.

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ả.
Sắp xếp mảng PHP
Sắp xếp mảng PHP - ảnh minh họa

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ụ:
 

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
  customSort($assoc, false),   // sort descending
  customSort($numeric),        // sort ascending
  customSort($numeric, false), // sort descending
);

..
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$numeric, thông qua hàm customSort theo thứ tự tăng dần và giảm dần.
 

// sort $assoc in ascending order
array(3) {
  ["bar"]=>
  string(3) "bar"
  ["baz"]=>
  string(3) "baz"
  ["foo"]=>
  string(3) "foo"
}
// sort $assoc in descending order
array(3) {
  ["foo"]=>
  string(3) "foo"
  ["baz"]=>
  string(3) "baz"
  ["bar"]=>
  string(3) "bar"
}
// sort $numeric in ascending order
array(3) {
  [2]=>
  string(3) "foo"
  [5]=>
  string(3) "bar"
  [12]=>
  string(3) "baz"
}
// sort $numeric in descending order
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 ý.

 'food',
  'bass'    => 'bass',
  'battery' => 'battery',
];

var_dump(
  customSortCb(
    $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

Tin liên quan