Home  >  Article  >  Backend Development  >  In-depth analysis of PHP array_multisort() function

In-depth analysis of PHP array_multisort() function

高洛峰
高洛峰Original
2017-01-06 16:49:541232browse

1. Let’s look at the simplest situation first. There are two arrays:
$arr1 = array(1,9,5);
$arr2 = array(6,2,4);
array_multisort($arr1,$arr2);
print_r($arr1); // The order obtained is 1,5,9
print_r($arr2); // The order obtained is 6,4,2
I estimate that the values ​​​​of the two arrays are the same from beginning to end Correspondingly: 1 corresponds to 6, 9 corresponds to 2, and 5 corresponds to 4.
Let’s add one more array and see what happens:
$arr1 = array(1,9,5);
$arr2 = array(6,2,4);
$arr3 = array(3,7,8);
array_multisort($arr1,$arr2,$arr3);
Looking at the results, 1 corresponds to 6 and 3 from beginning to end, and the same is true for other items. This correspondence is what the manual calls "preserving the original key name association during sorting".
You can also think of each array as a column in a database table. The corresponding 1,6,3 is one data row, and 9,2,7 is another data row. . .
array_multisort will first sort by the first array (imagine as a column). If the values ​​of the first array (column) are the same, then sort by the second array (column).
Specifically, you can use the following program to test:
$arr1 = array(1,9,5,9);
$arr2 = array(6,2,4,1);
$ arr3 = array(3,7,8,0);
array_multisort($arr1,$arr2,$arr3);
You can imagine that the result of $arr3 here is (3,8,0,7).

2. Next, we will explain the parameters of array_multisort. The parameters of this function are very flexible. The simplest case is to use 1 or n arrays as parameters as shown above. It should be noted that the number of items in each array must be the same, otherwise a warning will cause the sorting to fail.
Like this array_multisort($arr1,$arr2,$arr3); The default is that all arrays are arranged in ascending order. If you want to sort $arr2 in descending order and compare it as a string, you must write:
array_multisort( $arr1, $arr2, SORT_DESC, SORT_STRING, $arr3);
Each array can be followed by a sort order flag or a sort type flag, or both flags may appear at the same time. But only one sort flag of each type can appear after each array.
Details are as follows:
Sort order flags:
SORT_ASC - Sort items in ascending order (default)
SORT_DESC - Sort items in descending order
Sort type flags:
SORT_REGULAR - Sort items in normal order Method comparison (default)
SORT_NUMERIC - Compare items based on numeric values ​​
SORT_STRING - Compare items based on strings

3. Finally, what is the actual effect of array_multisort.
We usually have some multi-dimensional arrays that need to be sorted:

$guys = Array
(
    [0] => Array
        (
 [name] => jake
 [score] => 80
 [grade] => A
        )
    [1] => Array
        (
 [name] => jin
 [score] => 70
 [grade] => A
        )
    [2] => Array
        (
 [name] => john
 [score] => 80
 [grade] => A
        )
    [3] => Array
        (
 [name] => ben
 [score] => 20
 [grade] => B
        )
)

For example, we want to sort by grades in reverse order, and if the grades are the same, sort by name in ascending order.
At this time we need to create two more arrays according to the order of $guys:
$scores = array(80,70,80,20);
$names = array('jake',' jin','john','ben');
Then
array_multisort($scores, SORT_DESC, $names, $guys);That's it
Can it be more flexible? I want to sort every time Do we need to get some additional arrays?
In fact, it has been well encapsulated in the helper_array class of qeephp. Here are its two methods. Those who need it can modify it themselves:

/**
* 根据指定的键对数组排序
*
* 用法:
* @code php
* $rows = array(
*array('id' => 1, 'value' => '1-1', 'parent' => 1),
*array('id' => 2, 'value' => '2-1', 'parent' => 1),
*array('id' => 3, 'value' => '3-1', 'parent' => 1),
*array('id' => 4, 'value' => '4-1', 'parent' => 2),
*array('id' => 5, 'value' => '5-1', 'parent' => 2),
*array('id' => 6, 'value' => '6-1', 'parent' => 3),
* );
*
* $rows = Helper_Array::sortByCol($rows, 'id', SORT_DESC);
* dump($rows);
* // 输出结果为:
* // array(
* //         array('id' => 6, 'value' => '6-1', 'parent' => 3),
* //         array('id' => 5, 'value' => '5-1', 'parent' => 2),
* //         array('id' => 4, 'value' => '4-1', 'parent' => 2),
* //         array('id' => 3, 'value' => '3-1', 'parent' => 1),
* //         array('id' => 2, 'value' => '2-1', 'parent' => 1),
* //         array('id' => 1, 'value' => '1-1', 'parent' => 1),
* // )
* @endcode
*
* @param array $array 要排序的数组
* @param string $keyname 排序的键
* @param int $dir 排序方向
*
* @return array 排序后的数组
*/
          static function sortByCol($array, $keyname, $dir = SORT_ASC)
          {
   return self::sortByMultiCols($array, array($keyname => $dir));
          }
          /**
* 将一个二维数组按照多个列进行排序,类似 SQL 语句中的 ORDER BY
*
* 用法:
* @code php
* $rows = Helper_Array::sortByMultiCols($rows, array(
*'parent' => SORT_ASC, 
*'name' => SORT_DESC,
* ));
* @endcode
*
* @param array $rowset 要排序的数组
* @param array $args 排序的键
*
* @return array 排序后的数组
*/
          static function sortByMultiCols($rowset, $args)
          {
   $sortArray = array();
   $sortRule = '';
   foreach ($args as $sortField => $sortDir) 
   {
       foreach ($rowset as $offset => $row) 
       {
$sortArray[$sortField][$offset] = $row[$sortField];
       }
       $sortRule .= '$sortArray[\'' . $sortField . '\'], ' . $sortDir . ', ';
   }
   if (empty($sortArray) || empty($sortRule)) { return $rowset; }
   eval('array_multisort(' . $sortRule . '$rowset);');
   return $rowset;
          }

More PHP array_multisort() functions For in-depth analysis of related articles, please pay attention to the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn