1. Hàm array_multisort() trong PHP

Hàm array_multisort() trong PHP được xử dụng để sắp xếp các mảng trong PHP. Hàm này có thể sắp xếp một số mảng cùng lúc hay sắp xếp mảng đa chiều theo một hoặc nhiều chiều. Hàm này sẽ trả về một mảng đã được sắp xếp. Với hàm này các key dạng chuỗi sẽ được giữ nguyên còn các key dạng số sẽ được reset lại và bắt đầu lại theo thứ tự tăng dần bắt đầu từ 0.

Ta cũng có thể chỉ định thứ sắp xếp và các tham số kiểu sắp xếp sau mỗi mảng. Nếu như ta không chỉ định thì mỗi tham số mảng sẽ được giá trị mặc định.

2. Cú pháp hàm array_multisort() trong PHP

Ta có cú pháp của hàm array_multisort() trong PHP là:

array_multisort(array1, sortorder, sorttype, array2, array3, ...)

Trong đó:

  • array1 : mảng chỉ định để sắp xếp . Tham số này là bắt buộc
  • sortorder : Tham số này chỉ định thứ tự sử dụng tức là theo thứ tự tăng dần hoặc giảm dần. Giá trị mặc định của tham số này là SORT_ASC. Tức là sắp xếp theo thứ tự tăng dần(A -> Z). Để sắp xếp theo thứ tự giảm dần(Z -> A), chúng ta sẽ phải đặt tham số này thành SORT_DESC.
  • sorttype : tham số này chỉ định tùy chọn sắp xếp cho các mảng
  • array2 , array3 : là những mảng chỉ định sắp xếp khác. Tham số này là không bắt buộc

Ta có một số tham số sortype có thể lựa chọn như sau:

  • SORT_REGULAR (mặc định) : So sánh các phần tử bình thường (Chuẩn ASCII).
  • SORT_NUMERIC : So sánh các phần tử dưới dạng giá trị số.
  • SORT_STRING : So sánh các phần tử dưới dạng giá trị chuỗi.
  • SORT_LOCALE_STRING : So sánh các phần tử dưới dạng chuỗi, dựa trên ngôn ngữ hiện tại(có thể được thay đổi bằng cách sử dụng setlocale ()).
  • SORT_NATURAL : So sánh các phần tử dưới dạng chuỗi bằng cách sử dụng “thứ tự tự nhiên” như natsort()
  • SORT_FLAG_CASE : Có thể được kết hợp (dùng or) với SORT_STRING hoặc SORT_NATURAL để sắp xếp các chuỗi không phân biệt chữ hoa chữ thường.

Nếu chúng ta muốn sắp xếp nhiều mảng, chúng ta có thể chuyển chúng dưới dạng các tham số như $array2, $array3… theo sau là sortorder , sorttype của chúng.

Ví dụ: sắp xếp mảng theo thứ tự tăng dần

<?php
$a=array("PHP","Java","Python","C","HTML");
array_multisort($a);
echo '<pre>';
print_r($a);
?>

Kết quả

Array
(
    [0] => C
    [1] => HTML
    [2] => Java
    [3] => PHP
    [4] => Python
)

Mảng sau khi sử dụng hàm array_multisort() đã được sắp xếp theo thứ tự trong bảng chữ cái. Khá là đơn giản phải không.

3. Ví dụ về hàm array_multisort() trong PHP

Ví dụ 1: sắp xếp hai mảng theo thứ tự tăng dần

<?php
$a1=array("PHP","HTML","C");
$a2=array("Python","Java","HTML");
array_multisort($a1,$a2);

echo '<pre>';
print_r($a1);

echo '<pre>';
print_r($a2);
?>

Kết quả

Array
(
    [0] => C
    [1] => HTML
    [2] => PHP
)
Array
(
    [0] => HTML
    [1] => Java
    [2] => Python
)

Ví dụ 2: sắp xếp với những giá trị giống nhau

<?php
$a1=array("Dog","Dog","Cat");
$a2=array("Pluto","Fido","Missy");
array_multisort($a1,$a2);

echo '<pre>';
print_r($a1);

echo '<pre>';
print_r($a2);
?>

Kết quả

Array
(
    [0] => Cat
    [1] => Dog
    [2] => Dog
)
Array
(
    [0] => Missy
    [1] => Fido
    [2] => Pluto
)

Với những giá trị giống nhau thì chúng vẫn được sắp xếp một cách bình thường và không bị thay đổi hay ghi đè.

Ví dụ 3: sắp xếp mảng sử dụng thêm thông số khác

<?php
$a1=array("PHP","Java","Python");
$a2=array("HTML","C","XML");
array_multisort($a1,SORT_ASC,$a2,SORT_DESC);

echo '<pre>';
print_r($a1);

echo '<pre>';
print_r($a2);
?>

Kết quả

Array
(
    [0] => Java
    [1] => PHP
    [2] => Python
)
Array
(
    [0] => C
    [1] => HTML
    [2] => XML
)

Trong ví dụ này với mảng $a1 thì mình sử dụng them thông số là SORT_ASC tức là vẫn sẽ sắp xếp theo thứ tự tăng dần và đây là giá trị mặc định (A -> Z). Nhưng với mảng $a2 thì mình lại truyền vào thông số là SORT_DESC . Lúc này thứ tự sắp xếp sẽ là giảm dần chứ không phải tăng dần nữa (Z -> A)

Ví dụ 4: Hợp nhất hai mảng và sắp xếp chúng dưới dạng số, theo thứ tự giảm dần:

<?php
$a1=array(1,30,15,7,25);
$a2=array(4,30,20,41,66);
$num=array_merge($a1,$a2);

array_multisort($num,SORT_DESC,SORT_NUMERIC);

echo '<pre>';
print_r($num);
?>

Kết quả

Array
(
    [0] => 66
    [1] => 41
    [2] => 30
    [3] => 30
    [4] => 25
    [5] => 20
    [6] => 15
    [7] => 7
    [8] => 4
    [9] => 1
)

Ở ví dụ này đầu tiên mình đã nối hai mảng lại thành một mảng là $num . Hàm được sử dụng ở đây là hàm array_merge() mà ta đã được tìm hiểu rồi. Sau đó là sử dụng hàm array_multisort() để sắp xếp như bình thường theo yêu cầu bài toán thôi. Ở đây là sắp xếp dạng số theo thứ tự giảm dần vì vậy ta phải truyền thêm vào hai thông số là SORT_DESCSORT_NUMERIC

Ví dụ 5: sắp xếp mảng đa chiều

<?php
$a = array(
       array("10", 11, 100, 100, "a"),
       array(   1,  2, "2",   3,   1)
      );
array_multisort($ar[0], SORT_ASC, SORT_STRING,
                $ar[1], SORT_NUMERIC, SORT_DESC);
echo '<pre>';
var_dump($a);
?>

Kết quả

array(2) {
  [0]=>
  array(5) {
    [0]=>
    string(2) "10"
    [1]=>
    int(11)
    [2]=>
    int(100)
    [3]=>
    int(100)
    [4]=>
    string(1) "a"
  }
  [1]=>
  array(5) {
    [0]=>
    int(1)
    [1]=>
    int(2)
    [2]=>
    string(1) "2"
    [3]=>
    int(3)
    [4]=>
    int(1)
  }
}

Trong ví dụ này, sau khi sắp xếp, mảng đầu tiên sẽ biến đổi thành “10”, 100, 100, 11, “a” (nó được sắp xếp thành chuỗi theo thứ tự tăng dần). Hộp thứ hai sẽ chứa 1, 3, “2”, 2, 1 (được sắp xếp dưới dạng số, theo thứ tự giảm dần).

Ví dụ 6: Sắp xếp mảng không phân biệt chữ hoa chữ thường

<?php
$array = array('Alpha', 'atomic', 'Beta', 'bank');
$array_lowercase = array_map('strtolower', $array); 

array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $array);

echo '<pre>';
print_r($array);
?>

Kết quả

Array
(
    [0] => Alpha
    [1] => atomic
    [2] => bank
    [3] => Beta
)

SORT_STRINGSORT_REGULAR đều phân biệt chữ hoa chữ thường, các chuỗi bắt đầu bằng chữ hoa sẽ đứng trước các chuỗi bắt đầu bằng chữ thường. Mình đã sử dụng hàm array_map() để chuyển đổi hàm $array thành chữ thường. Sau đó tiến hành sắp xếp giá trị mảng đã chuyển đổi thành chữ thường. Mảng ban đầu sẽ từ đây mà sắp xếp các phần tử theo mảng chữ thường.

Để thực hiện sắp xếp không phân biệt chữ hoa chữ thường, ta buộc thứ tự sắp xếp được xác định bằng một bản sao viết thường của mảng ban đầu.