Sử dụng hàm sắp xếp để xử lý mảng trong PHP

PHP Tutorial | by Học PHP

Bạn có thể thu thập danh sách điểm số học sinh một cách ngẫu nhiên, hay nhận được dữ liệu sản phẩm không theo một trình tự nào. Để làm cho thông tin dễ hiểu, dễ tìm kiếm và dễ xử lý hơn, việc sắp xếp mảng là một kỹ năng không thể thiếu.

Sắp xếp mảng đơn giản là việc bố trí lại các phần tử trong mảng theo một thứ tự nhất định—có thể là tăng dần, giảm dần, theo thứ tự bảng chữ cái, hoặc theo một tiêu chí nào đó mà bạn định nghĩa. Imagine a library with books scattered everywhere; sorting them by author or title makes them much more useful! Trong PHP, có nhiều hàm được tích hợp sẵn giúp bạn thực hiện việc này một cách hiệu quả, phù hợp với từng loại mảng và nhu cầu cụ thể. Bài viết này sẽ hướng dẫn bạn cách sử dụng các hàm sắp xếp cơ bản nhất, từ việc sắp xếp các số đơn giản đến việc tổ chức lại dữ liệu phức tạp hơn trong mảng kết hợp, giúp dữ liệu của bạn luôn được trình bày một cách khoa học và dễ quản lý.

Các Hàm Sắp Xếp Cơ Bản Cho Mảng Có Chỉ Số (Indexed Arrays) trong PHP

Khi làm việc với mảng có chỉ số, việc sắp xếp các phần tử thường đi kèm với mong muốn giữ cho các chỉ số số nguyên được liên tục (bắt đầu từ 0). PHP cung cấp các hàm chuyên biệt để thực hiện điều này một cách dễ dàng.

sort(): Sắp Xếp Giá Trị Tăng Dần (và Gán Lại Chỉ Số Số Nguyên)

Hàm sort() là lựa chọn hàng đầu khi bạn muốn sắp xếp một mảng có chỉ số theo thứ tự tăng dần của các giá trị.

Cách thức hoạt động:

Nó sẽ sắp xếp tất cả các phần tử trong mảng theo thứ tự tăng dần:

  • Đối với số: Từ nhỏ nhất đến lớn nhất (ví dụ: 1, 5, 10).

  • Đối với chuỗi: Theo thứ tự bảng chữ cái (ví dụ: "Apple", "Banana", "Cherry").

Sau khi sắp xếp, sort() sẽ gán lại chỉ số số nguyên cho các phần tử, bắt đầu từ 0, đảm bảo rằng mảng vẫn giữ được cấu trúc chỉ số liên tục.Cú pháp:

sort($array);
  • $array: Mảng bạn muốn sắp xếp. Lưu ý: Hàm này thay đổi trực tiếp mảng gốc, không trả về mảng mới.Ví dụ code minh họa:
<?php
echo "<h3>1. Sử dụng `sort()`</h3>";

// Ví dụ 1: Sắp xếp một mảng số
$scores = [85, 72, 90, 65, 88];
echo "Mảng điểm số ban đầu: ";
echo "<pre>"; print_r($scores); echo "</pre>";

sort($scores); // Sắp xếp tăng dần
echo "Mảng điểm số sau khi dùng `sort()`: ";
echo "<pre>"; print_r($scores); echo "</pre>";
/*
Output:
Array
(
    [0] => 65
    [1] => 72
    [2] => 85
    [3] => 88
    [4] => 90
)
*/
echo "Các chỉ số đã được gán lại từ 0.<br>";

echo "<hr>";

// Ví dụ 2: Sắp xếp một mảng chuỗi
$fruits = ["Cherry", "Banana", "Apple", "Date"];
echo "Mảng trái cây ban đầu: ";
echo "<pre>"; print_r($fruits); echo "</pre>";

sort($fruits); // Sắp xếp tăng dần theo bảng chữ cái
echo "Mảng trái cây sau khi dùng `sort()`: ";
echo "<pre>"; print_r($fruits); echo "</pre>";
/*
Output:
Array
(
    [0] => Apple
    [1] => Banana
    [2] => Cherry
    [3] => Date
)
*/
echo "Các chỉ số đã được gán lại từ 0.<br>";
?>

rsort(): Sắp Xếp Giá Trị Giảm Dần (và Gán Lại Chỉ Số Số Nguyên)

Hàm rsort() là "ngược lại" của sort(). Nó giúp bạn sắp xếp mảng có chỉ số theo thứ tự giảm dần của các giá trị.

Cách thức hoạt động:

  • Nó sẽ sắp xếp tất cả các phần tử trong mảng theo thứ tự giảm dần:

    • Đối với số: Từ lớn nhất đến nhỏ nhất (ví dụ: 10, 5, 1).

    • Đối với chuỗi: Theo thứ tự bảng chữ cái ngược lại (ví dụ: "Cherry", "Banana", "Apple").

  • Tương tự như sort(), rsort() cũng sẽ gán lại chỉ số số nguyên cho các phần tử, bắt đầu từ 0.

Cú pháp:

rsort($array);

$array: Mảng bạn muốn sắp xếp. Lưu ý: Hàm này cũng thay đổi trực tiếp mảng gốc.

Ví dụ code minh họa:

<?php
echo "<h3>2. Sử dụng `rsort()`</h3>";

// Ví dụ 1: Sắp xếp một mảng số
$scores = [85, 72, 90, 65, 88];
echo "Mảng điểm số ban đầu: ";
echo "<pre>"; print_r($scores); echo "</pre>";

rsort($scores); // Sắp xếp giảm dần
echo "Mảng điểm số sau khi dùng `rsort()`: ";
echo "<pre>"; print_r($scores); echo "</pre>";
/*
Output:
Array
(
    [0] => 90
    [1] => 88
    [2] => 85
    [3] => 72
    [4] => 65
)
*/
echo "Các chỉ số đã được gán lại từ 0.<br>";

echo "<hr>";

// Ví dụ 2: Sắp xếp một mảng chuỗi
$fruits = ["Cherry", "Banana", "Apple", "Date"];
echo "Mảng trái cây ban đầu: ";
echo "<pre>"; print_r($fruits); echo "</pre>";

rsort($fruits); // Sắp xếp giảm dần theo bảng chữ cái
echo "Mảng trái cây sau khi dùng `rsort()`: ";
echo "<pre>"; print_r($fruits); echo "</pre>";
/*
Output:
Array
(
    [0] => Date
    [1] => Cherry
    [2] => Banana
    [3] => Apple
)
*/
echo "Các chỉ số đã được gán lại từ 0.<br>";
?>

Các Hàm Sắp Xếp Cho Mảng Kết Hợp (Associative Arrays) trong PHP

Khi làm việc với mảng kết hợp, nơi mỗi giá trị được liên kết với một khóa có ý nghĩa, điều quan trọng thường là duy trì liên kết này ngay cả sau khi sắp xếp. PHP cung cấp một bộ hàm sắp xếp đặc biệt cho mảng kết hợp, cho phép bạn sắp xếp dựa trên giá trị hoặc khóa mà vẫn giữ nguyên mối quan hệ giữa chúng.

asort(): Sắp Xếp Theo Giá Trị Tăng Dần (Duy Trì Liên Kết Khóa-Giá Trị)

Hàm asort() giúp bạn sắp xếp mảng kết hợp dựa trên các giá trị của nó theo thứ tự tăng dần, đồng thời đảm bảo rằng các khóa vẫn "dính" với giá trị ban đầu của chúng.

  • Cách thức hoạt động: Sắp xếp các phần tử dựa trên giá trị của chúng theo thứ tự tăng dần (từ nhỏ đến lớn, A-Z). Điểm mấu chốt là nó duy trì liên kết giữa khóa và giá trị của mỗi phần tử. Điều này có nghĩa là, nếu khóa "Alice" có giá trị 85, thì sau khi sắp xếp, "Alice" và 85 vẫn đi cùng nhau.

  • Cú pháp:

asort($array);
  • $array: Mảng kết hợp bạn muốn sắp xếp. Hàm này thay đổi trực tiếp mảng gốc.

Ví dụ code minh họa:

<?php
echo "<h3>1. Sử dụng `asort()`</h3>";

// Sắp xếp danh sách điểm thi của học sinh theo điểm số (giữ nguyên tên học sinh)
$studentScores = [
    "Alice" => 85,
    "Bob" => 72,
    "Charlie" => 90,
    "David" => 65,
    "Eve" => 88
];
echo "Điểm học sinh ban đầu: ";
echo "<pre>"; print_r($studentScores); echo "</pre>";

asort($studentScores); // Sắp xếp theo giá trị (điểm số) tăng dần
echo "Điểm học sinh sau khi dùng `asort()` (sắp xếp theo điểm, giữ tên): ";
echo "<pre>"; print_r($studentScores); echo "</pre>";
/*
Output:
Array
(
    [David] => 65
    [Bob] => 72
    [Alice] => 85
    [Eve] => 88
    [Charlie] => 90
)
*/
echo "Thứ tự đã thay đổi dựa trên điểm số, nhưng tên học sinh vẫn đúng với điểm.<br>";
?>

arsort(): Sắp Xếp Theo Giá Trị Giảm Dần (Duy Trì Liên Kết Khóa-Giá Trị)

arsort() là phiên bản sắp xếp giảm dần của asort(), rất hữu ích khi bạn muốn xem các giá trị cao nhất trước.

  • Cách thức hoạt động: Sắp xếp các phần tử dựa trên giá trị của chúng theo thứ tự giảm dần (từ lớn đến nhỏ, Z-A). Giống như asort(), nó cũng duy trì liên kết giữa khóa và giá trị.

  • Cú pháp:

arsort($array);
  • $array: Mảng kết hợp bạn muốn sắp xếp. Hàm này thay đổi trực tiếp mảng gốc.

Ví dụ code minh họa:

<?php
echo "<h3>2. Sử dụng `arsort()`</h3>";

// Sắp xếp danh sách điểm thi của học sinh theo điểm số (giảm dần)
$studentScores = [
    "Alice" => 85,
    "Bob" => 72,
    "Charlie" => 90,
    "David" => 65,
    "Eve" => 88
];
echo "Điểm học sinh ban đầu: ";
echo "<pre>"; print_r($studentScores); echo "</pre>";

arsort($studentScores); // Sắp xếp theo giá trị (điểm số) giảm dần
echo "Điểm học sinh sau khi dùng `arsort()` (sắp xếp theo điểm giảm dần, giữ tên): ";
echo "<pre>"; print_r($studentScores); echo "</pre>";
/*
Output:
Array
(
    [Charlie] => 90
    [Eve] => 88
    [Alice] => 85
    [Bob] => 72
    [David] => 65
)
*/
echo "Học sinh có điểm cao nhất hiện ra trước.<br>";
?>

ksort(): Sắp Xếp Theo Khóa Tăng Dần (Duy Trì Liên Kết Khóa-Giá Trị)

Nếu bạn muốn sắp xếp mảng kết hợp dựa trên chính các khóa của nó, ksort() là hàm bạn cần.

Cách thức hoạt động: Sắp xếp các phần tử dựa trên khóa của chúng theo thứ tự tăng dần (theo bảng chữ cái hoặc số học). Hàm này cũng duy trì liên kết giữa khóa và giá trị.

Cú pháp:

ksort($array);
  • $array: Mảng kết hợp bạn muốn sắp xếp. Hàm này thay đổi trực tiếp mảng gốc.
  1. Ví dụ code minh họa:

<?php
echo "<h3>3. Sử dụng `ksort()`</h3>";

// Sắp xếp danh sách thông tin người dùng theo thứ tự chữ cái của các khóa
$userInfo = [
    "name" => "Jane Doe",
    "age" => 30,
    "city" => "London",
    "zip" => "SW1A 0AA",
    "email" => "[email protected]"
];
echo "Thông tin người dùng ban đầu: ";
echo "<pre>"; print_r($userInfo); echo "</pre>";

ksort($userInfo); // Sắp xếp theo khóa tăng dần
echo "Thông tin người dùng sau khi dùng `ksort()` (sắp xếp theo khóa): ";
echo "<pre>"; print_r($userInfo); echo "</pre>";
/*
Output:
Array
(
    [age] => 30
    [city] => London
    [email] => [email protected]
    [name] => Jane Doe
    [zip] => SW1A 0AA
)
*/
echo "Các khóa được sắp xếp theo thứ tự bảng chữ cái.<br>";
?>

krsort(): Sắp Xếp Theo Khóa Giảm Dần (Duy Trì Liên Kết Khóa-Giá Trị)

krsort() là hàm đối nghịch với ksort(), sắp xếp các phần tử theo thứ tự giảm dần của khóa.

  • Cách thức hoạt động: Sắp xếp các phần tử dựa trên khóa của chúng theo thứ tự giảm dần (theo bảng chữ cái ngược lại hoặc số học). Hàm này cũng duy trì liên kết giữa khóa và giá trị.

  • Cú pháp:

krsort($array);
  • $array: Mảng kết hợp bạn muốn sắp xếp. Hàm này thay đổi trực tiếp mảng gốc.

Ví dụ code minh họa:

<?php
echo "<h3>4. Sử dụng `krsort()`</h3>";

// Sắp xếp danh sách thông tin theo khóa giảm dần
$userInfo = [
    "name" => "Jane Doe",
    "age" => 30,
    "city" => "London",
    "zip" => "SW1A 0AA",
    "email" => "[email protected]"
];
echo "Thông tin người dùng ban đầu: ";
echo "<pre>"; print_r($userInfo); echo "</pre>";

krsort($userInfo); // Sắp xếp theo khóa giảm dần
echo "Thông tin người dùng sau khi dùng `krsort()` (sắp xếp theo khóa giảm dần): ";
echo "<pre>"; print_r($userInfo); echo "</pre>";
/*
Output:
Array
(
    [zip] => SW1A 0AA
    [name] => Jane Doe
    [email] => [email protected]
    [city] => London
    [age] => 30
)
*/
echo "Các khóa được sắp xếp theo thứ tự bảng chữ cái ngược lại.<br>";
?>

So Sánh Các Hàm Sắp Xếp Chính Trong PHP

Việc lựa chọn hàm sắp xếp phù hợp là rất quan trọng để đảm bảo dữ liệu của bạn được tổ chức đúng cách và ứng dụng hoạt động hiệu quả. Các hàm sắp xếp trong PHP có thể được nhóm lại dựa trên mục đích chính của chúng: sắp xếp theo giá trị hay theo khóa, và có giữ lại liên kết khóa-giá trị hay không.

Dưới đây là bảng tóm tắt và so sánh các hàm sắp xếp cơ bản:

Hàm

Sắp xếp theo

Thứ tự

Gán lại chỉ số số nguyên?

Duy trì liên kết khóa-giá trị?

Phù hợp nhất cho

sort()

Giá trị

Tăng dần

KHÔNG

Mảng có chỉ số (danh sách)

rsort()

Giá trị

Giảm dần

KHÔNG

Mảng có chỉ số (danh sách)

asort()

Giá trị

Tăng dần

KHÔNG (chỉ mảng kết hợp)

Mảng kết hợp (theo giá trị)

arsort()

Giá trị

Giảm dần

KHÔNG (chỉ mảng kết hợp)

Mảng kết hợp (theo giá trị)

ksort()

Khóa

Tăng dần

KHÔNG

Mảng kết hợp (theo khóa)

krsort()

Khóa

Giảm dần

KHÔNG

Mảng kết hợp (theo khóa)

Khi Nào Nên Dùng Loại Hàm Nào?

Việc lựa chọn hàm sắp xếp phụ thuộc vào hai yếu tố chính:

  • Loại mảng bạn đang xử lý: Mảng có chỉ số hay mảng kết hợp?

  • Mục đích sắp xếp: Bạn muốn sắp xếp theo giá trị hay theo khóa, và có cần duy trì liên kết giữa khóa và giá trị hay không?

1. Khi bạn có một danh sách đơn thuần (Mảng có chỉ số) và muốn sắp xếp các mục:

Sử dụng sort() (tăng dần) hoặc rsort() (giảm dần). Các hàm này sẽ sắp xếp các giá trị và gán lại các chỉ số số nguyên một cách liên tục, giúp bạn dễ dàng duyệt qua danh sách đã sắp xếp.

  • Ví dụ: Sắp xếp danh sách tên các thành phố hoặc điểm số của các môn học không cần biết tên học sinh.

<?php
$cities = ["London", "Paris", "New York", "Tokyo"];
sort($cities); // Sắp xếp theo tên thành phố tăng dần, chỉ số được gán lại
print_r($cities);
// Output: Array ( [0] => London [1] => New York [2] => Paris [3] => Tokyo )

$scores = [85, 92, 78, 95];
rsort($scores); // Sắp xếp điểm giảm dần, chỉ số được gán lại
print_r($scores);
// Output: Array ( [0] => 95 [1] => 92 [2] => 85 [3] => 78 )
?>

2. Khi bạn có dữ liệu dạng cặp (Khóa-Giá trị) và muốn sắp xếp theo GIÁ TRỊ, nhưng cần giữ nguyên mối quan hệ giữa chúng:

Sử dụng asort() (tăng dần) hoặc arsort() (giảm dần). Điều này rất quan trọng khi khóa của bạn mang ý nghĩa (ví dụ: tên người, ID sản phẩm) và bạn không muốn nó bị tách rời khỏi giá trị tương ứng.

Ví dụ: Sắp xếp danh sách điểm thi của học sinh theo điểm số (cao đến thấp) mà vẫn biết học sinh nào đạt điểm đó.

<?php
$student_grades = ["Alice" => 85, "Bob" => 92, "Charlie" => 78, "David" => 95];
arsort($student_grades); // Sắp xếp theo điểm giảm dần, tên học sinh vẫn dính với điểm
print_r($student_grades);
// Output: Array ( [David] => 95 [Bob] => 92 [Alice] => 85 [Charlie] => 78 )
?>

Khi bạn có dữ liệu dạng cặp và muốn sắp xếp theo KHÓA (key), đồng thời giữ nguyên mối quan hệ giữa chúng:

Sử dụng ksort() (tăng dần) hoặc krsort() (giảm dần). Điều này hữu ích khi bạn muốn tổ chức dữ liệu dựa trên tên thuộc tính hoặc mã định danh.

  • Ví dụ: Sắp xếp thông tin cấu hình theo tên cấu hình hoặc sắp xếp dữ liệu người dùng theo ID của họ (nếu ID là khóa).

<?php
$config_settings = ["timeout" => 30, "debug_mode" => true, "log_level" => "info"];
ksort($config_settings); // Sắp xếp theo khóa tăng dần (alphabetical)
print_r($config_settings);
// Output: Array ( [debug_mode] => 1 [log_level] => info [timeout] => 30 )

$product_details = ["sku-003" => "Mouse", "sku-001" => "Keyboard", "sku-002" => "Monitor"];
krsort($product_details); // Sắp xếp theo khóa giảm dần
print_r($product_details);
// Output: Array ( [sku-003] => Mouse [sku-002] => Monitor [sku-001] => Keyboard )
?>

Việc hiểu rõ mục đích và hành vi của từng hàm sắp xếp sẽ giúp bạn tối ưu hóa việc quản lý và trình bày dữ liệu trong các ứng dụng PHP của mình.

Các Tùy Chọn Sắp Xếp Nâng Cao trong PHP

Ngoài các hàm sắp xếp cơ bản đã học, PHP còn cung cấp những công cụ mạnh mẽ hơn để xử lý các tình huống sắp xếp phức tạp, đặc biệt là khi bạn cần sắp xếp theo những tiêu chí riêng hoặc trên dữ liệu đa chiều.

Sắp Xếp Tùy Chỉnh Bằng Hàm Do Người Dùng Định Nghĩa: usort(), uasort(), uksort()

Đôi khi, các quy tắc sắp xếp mặc định của PHP (số học, bảng chữ cái) không đủ cho nhu cầu của bạn. Ví dụ, bạn muốn sắp xếp một danh sách các đối tượng theo một thuộc tính cụ thể của đối tượng đó, hoặc sắp xếp các chuỗi không phân biệt chữ hoa/thường. Lúc này, bạn cần đến các hàm sắp xếp tùy chỉnh.

  • usort($array, $callback): Sắp xếp mảng có chỉ số theo giá trị bằng hàm so sánh do người dùng định nghĩa. Hàm này sẽ gán lại chỉ số số nguyên.

  • uasort($array, $callback): Sắp xếp mảng kết hợp theo giá trị bằng hàm so sánh do người dùng định nghĩa, duy trì liên kết khóa-giá trị.

  • uksort($array, $callback): Sắp xếp mảng kết hợp theo khóa bằng hàm so sánh do người dùng định nghĩa, duy trì liên kết khóa-giá trị.

Cách thức hoạt động của $callback (hàm so sánh): Hàm callback này phải nhận hai tham số (thường là $a$b) đại diện cho hai phần tử đang được so sánh. Nó phải trả về một số nguyên:

  • < 0 (số âm): Nếu $a được coi là nhỏ hơn $b.

  • 0: Nếu $a$b được coi là bằng nhau.

  • > 0 (số dương): Nếu $a được coi là lớn hơn $b.

  • Ví dụ code minh họa (uasort()): Sắp xếp danh sách người dùng theo độ dài tên giảm dần

<?php
echo "<h3>1. Sắp Xếp Tùy Chỉnh Bằng Hàm Do Người Dùng Định Nghĩa (`uasort()`)</h3>";

$users = [
    "u1" => ["name" => "Bob", "age" => 30],
    "u2" => ["name" => "Alice", "age" => 25],
    "u3" => ["name" => "Charlie", "age" => 35],
    "u4" => ["name" => "David", "age" => 28]
];
echo "Danh sách người dùng ban đầu: ";
echo "<pre>"; print_r($users); echo "</pre>";

// Định nghĩa hàm so sánh tùy chỉnh: Sắp xếp theo độ dài tên giảm dần
uasort($users, function($userA, $userB) {
    $lenA = strlen($userA['name']);
    $lenB = strlen($userB['name']);

    if ($lenA == $lenB) {
        return 0; // Độ dài bằng nhau, giữ nguyên thứ tự tương đối
    }
    return ($lenA < $lenB) ? 1 : -1; // Nếu A ngắn hơn B, A sẽ đứng sau (1), ngược lại (-1)
});

echo "Danh sách người dùng sau khi sắp xếp theo độ dài tên giảm dần: ";
echo "<pre>"; print_r($users); echo "</pre>";
/*
Output:
Array
(
    [u3] => Array ( [name] => Charlie [age] => 35 ) // Charlie (7 ký tự)
    [u2] => Array ( [name] => Alice [age] => 25 )   // Alice (5 ký tự)
    [u4] => Array ( [name] => David [age] => 28 )   // David (5 ký tự) - thứ tự tương đối với Alice được giữ
    [u1] => Array ( [name] => Bob [age] => 30 )     // Bob (3 ký tự)
)
*/
?>

Sắp Xếp Nhiều Mảng Hoặc Sắp Xếp Mảng Đa Chiều: array_multisort()

Hàm array_multisort() là một công cụ cực kỳ mạnh mẽ khi bạn cần sắp xếp nhiều mảng cùng một lúc, hoặc sắp xếp một mảng đa chiều dựa trên một cột (thuộc tính) cụ thể. Nó coi các mảng (hoặc cột trong mảng đa chiều) như các cột trong một bảng tính và sắp xếp chúng đồng bộ.

  • Cách thức hoạt động: Sắp xếp một hoặc nhiều mảng. Các mảng tiếp theo sẽ được sắp xếp theo các tham số trước đó. Nghĩa là, nếu giá trị ở tham số đầu tiên bằng nhau, nó sẽ dùng tham số thứ hai để sắp xếp, v.v.

  • Cú pháp:

array_multisort($array1, $sort_order1, $sort_flags1, $array2, ...);

$array1, $array2, ...: Các mảng bạn muốn sắp xếp.

  • $sort_order (tùy chọn): Thứ tự sắp xếp (ví dụ: SORT_ASC cho tăng dần, SORT_DESC cho giảm dần). Mặc định là SORT_ASC.

  • $sort_flags (tùy chọn): Kiểu sắp xếp (ví dụ: SORT_REGULAR cho so sánh thông thường, SORT_NUMERIC cho số, SORT_STRING cho chuỗi). Mặc định là SORT_REGULAR.

Ví dụ code minh họa: Sắp xếp danh sách học sinh theo điểm số (giảm dần), nếu điểm số bằng nhau thì sắp xếp theo tên (tăng dần)

<?php
echo "<h3>2. Sắp Xếp Nhiều Mảng Hoặc Mảng Đa Chiều (`array_multisort()`)</h3>";

$students = [
    ["name" => "Charlie", "score" => 85, "age" => 17],
    ["name" => "Alice", "score" => 90, "age" => 16],
    ["name" => "Bob", "score" => 85, "age" => 18],
    ["name" => "David", "score" => 90, "age" => 16]
];
echo "Danh sách học sinh ban đầu: ";
echo "<pre>"; print_r($students); echo "</pre>";

// Bước 1: Trích xuất các cột cần sắp xếp vào các mảng tạm
$scores = array_column($students, 'score');
$names = array_column($students, 'name');

// Bước 2: Sắp xếp bằng array_multisort()
// Sắp xếp theo điểm số (scores) giảm dần, sau đó nếu điểm bằng nhau thì theo tên (names) tăng dần
array_multisort($scores, SORT_DESC,   // Sắp xếp scores giảm dần
                $names, SORT_ASC,     // Nếu scores bằng nhau, sắp xếp names tăng dần
                $students);           // Áp dụng các thay đổi vào mảng $students gốc

echo "Danh sách học sinh sau khi sắp xếp theo điểm giảm dần, tên tăng dần: ";
echo "<pre>"; print_r($students); echo "</pre>";
/*
Output:
Array
(
    [0] => Array ( [name] => Alice [score] => 90 [age] => 16 ) // Điểm 90, tên Alice
    [1] => Array ( [name] => David [score] => 90 [age] => 16 ) // Điểm 90, tên David (Alice trước David)
    [2] => Array ( [name] => Bob [score] => 85 [age] => 18 )   // Điểm 85, tên Bob
    [3] => Array ( [name] => Charlie [score] => 85 [age] => 17 ) // Điểm 85, tên Charlie (Bob trước Charlie)
)
*/
?>

Kết bài

Việc sắp xếp mảng là một kỹ năng nền tảng và cực kỳ quan trọng trong lập trình PHP, giúp bạn biến dữ liệu thô thành thông tin có tổ chức, dễ đọc và dễ xử lý. Dù bạn đang quản lý danh sách sản phẩm, điểm số học sinh, hay bất kỳ tập hợp dữ liệu nào khác, khả năng sắp xếp chúng theo một trình tự logic sẽ nâng cao đáng kể hiệu quả của ứng dụng.

Chúng ta đã tìm hiểu các hàm sắp xếp cơ bản và nâng cao, mỗi hàm phục vụ một mục đích cụ thể:

  • sort()rsort(): Lý tưởng cho các mảng có chỉ số khi bạn muốn sắp xếp theo giá trị và không ngại việc các chỉ số được gán lại liên tục từ 0.

  • asort()arsort(): Hoàn hảo cho mảng kết hợp khi bạn cần sắp xếp theo giá trị nhưng vẫn muốn duy trì mối liên kết giữa khóa và giá trị.

  • ksort()krsort(): Được sử dụng khi bạn muốn sắp xếp mảng kết hợp dựa trên chính các khóa của chúng, đồng thời giữ nguyên liên kết khóa-giá trị.

  • Các hàm tùy chỉnh (usort(), uasort(), uksort()): Cung cấp sự linh hoạt tối đa khi bạn cần sắp xếp dựa trên các logic phức tạp hoặc các thuộc tính cụ thể của đối tượng.

  • array_multisort(): Một công cụ mạnh mẽ để sắp xếp nhiều mảng đồng thời hoặc sắp xếp mảng đa chiều dựa trên nhiều tiêu chí.

Việc hiểu rõ mục đích và hành vi của từng hàm sắp xếp là chìa khóa để lựa chọn công cụ phù hợp nhất cho từng tình huống. Bằng cách áp dụng đúng hàm sắp xếp, bạn không chỉ làm cho dữ liệu của mình dễ quản lý hơn mà còn cải thiện trải nghiệm người dùng và hiệu suất của ứng dụng PHP.

Bài viết liên quan