In-depth analysis of PHP array_multisort() function_PHP tutorial

WBOY
Release: 2016-07-21 15:05:10
Original
775 people have browsed it

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 two The values ​​of the array 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 are one data row, and 9,2,7 are 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);
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 sorted in ascending order. If you want to sort $arr2 in descending order and compare it as a string, you need to 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 in ascending order (default)
SORT_DESC - Sort in descending order
Sort type flag:
SORT_REGULAR - compare items according to the usual method (default)
SORT_NUMERIC - compare items according to numeric values ​​
SORT_STRING - compare items according to strings

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

Copy the code The code is as follows:

$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? Do I have to get some additional arrays every time I want to sort?
In fact, it is well encapsulated in the helper_array class of qeephp. Here are its two methods. Those who need it can use it after modifying it themselves:
Copy code The code is as follows:

/**
* 根据指定的键对数组排序
*
* 用法:
* @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));
          }
          /**
* Sort a two-dimensional array by multiple columns, similar to ORDER BY in SQL statements
*
* Usage:
* @code php
* $rows = Helper_Array:: sortByMultiCols($rows, array(
*'parent' => SORT_ASC,
*'name' => SORT_DESC,
* ));
* @endcode
*
* @param array $rowset Array to be sorted
* @param array $args Key to sort
*
* @return array Sorted 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;
          }

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/327717.htmlTechArticle一、先看最简单的情况。有两个数组: $arr1 = array(1,9,5); $arr2 = array(6,2,4); array_multisort($arr1,$arr2); print_r($arr1); // 得到的顺序是1,5,9 print_r($ar...
source:php.cn
Statement of this Website
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template