Home  >  Article  >  Backend Development  >  Array_multisort Multidimensional array sorting usage complete solution

Array_multisort Multidimensional array sorting usage complete solution

高洛峰
高洛峰Original
2016-10-20 14:52:401394browse

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); // 得到的顺序是1,5,9
print_r($arr2); // 得到的顺序是6,4,2

I estimate that the values ​​​​of the two arrays are corresponding from beginning to end: 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".

Also, 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 sort by the first array (imagine as a column) first, and if the values ​​of the first array (column) are the same, it will be sorted by the second array (column).

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);

Output:

Array ( [0] => 1 [1] => 5 [2] => 9 [3] => 9 ) 
Array ( [0] => 6 [1] => 4 [2] => 1 [3] => 2 ) 
Array ( [0] => 3 [1] => 8 [2] => 0 [3] => 7 )

Here we find that $arr1 has been sorted in ascending order normally. But $arr2 and $arr3 are not sorted.

But when I looked carefully, I found that each element of these three arrays actually corresponded one to one.


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); By default, all arrays are sorted 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 flag:

SORT_ASC - Sort in ascending order (default)

SORT_DESC - Sort in descending order

Sort type flag:

SORT_REGULAR - Compare items in the usual way (default)

SORT_NUMERIC - Compare items based on numerical values ​​

SORT_STRING - Compare items based on strings

3. Finally, what is the practical 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 make 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? Every time I want to sort, Do you want to get some other 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;
}



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