比如下面的数组
$a=array(2,2,2,2,2,2,3,3);
$b=array(1,3,3,2,2,2,2,2);
$n=array(1,2,3,4,5,6,7,8);
foreach ($a as $k=>$i){
$c[]=array('a'=>$i,'b'=>$b[$k],'n'=>$n[$k]);
}
array_multisort($a,SORT_DESC,$n);
var_dump($n);
输出
array(7,8,1,2,3,4,5,6)
是先按数组a的方式来排序,数组n再默认按升序排序
array_multisort($a,SORT_DESC,$b,SORT_DESC,$n);
加上数组b后,先按数组a排序,再按数组b排序,数组n再默认按升序排序,输出
array(7,8,2,3,4,5,6,1)
$arr = [
1=>['a' => 1, 'b' => 20, 'c' => 1, 'd' => 0, 'name' => 'a1'],
2=>['a' => 1, 'b' => 2, 'c' => 20, 'd' => 35, 'name' => 'a2'],
3=>['a' => 1, 'b' => 2, 'c' => 20, 'd' => 31, 'name' => 'a3'],
4=>['a' => null, 'b' => 2, 'c' => 1, 'd' => 30, 'name' => 'a4'],
5=>['a' => 0, 'b' => 2, 'c' => 10, 'd' => 13, 'name' => 'a5'],
6=>['a' => 1, 'b' => 2, 'c' => 20, 'd' => 3, 'name' => 'a6'],
];
function sortArrByManyField() {
$args = func_get_args(); // 获取函数的参数的数组
if (empty($args)) {
return null;
}
$arr = array_shift($args); // array_shift() 函数删除数组中第一个元素,并返回被删除元素的值
foreach($args as $key => $field) { //field=a,key=0
if (is_string($field)) {
$temp = array();
foreach($arr as $index => $val) {
$temp[$index] = $val[$field]; // $index=0, $val['a'] =1
}
$args[$key] = $temp; // $args[0]= [1,1,1,NULL,0,1]
}
}
$args[] = &$arr; //引用值
call_user_func_array('array_multisort', $args);
//将第二个参数作为参数传给第一个参数,第一个参数是方法名
//array_multisort,参数可以是数组+顺序+排序类型(字符串/数字), 或者数组+顺序+数组+顺序。后一个数组按前一个数组的顺序排序
return array_pop($args);
// array_pop()功能是数组的最后一个元素出栈,返回值是数组的最后一个元素
}
$arr = sortArrByManyField($arr, 'a', SORT_DESC, 'b', SORT_DESC, 'c', SORT_ASC, 'd', SORT_ASC);
//var_dump($arr);
call_user_func_array中传入的$args是
[
0=>[1,1,1,NULL,0,1],
1=>3,//这里应该是对应的SORT_DESC
2=>[20,2,2,2,2,2],
3=>3,
4=>[1,20,20,1,10,20],
5=>4,
6=>[0,35,31,30,13,3],
7=>4,
8=>&[
1=>['a' => 1, 'b' => 20, 'c' => 1, 'd' => 0, 'name' => 'a1'],
2=>['a' => 1, 'b' => 2, 'c' => 20, 'd' => 35, 'name' => 'a2'],
3=>['a' => 1, 'b' => 2, 'c' => 20, 'd' => 31, 'name' => 'a3'],
4=>['a' => null, 'b' => 2, 'c' => 1, 'd' => 30, 'name' => 'a4'],
5=>['a' => 0, 'b' => 2, 'c' => 10, 'd' => 13, 'name' => 'a5'],
6=>['a' => 1, 'b' => 2, 'c' => 20, 'd' => 3, 'name' => 'a6'],
],
]
最后获取到的就是按a降序,b降序,c升序,d升序,排列好的多维数组
即顺序为a1,a6,a3,a2,a4,a5
附上打印出来的结果
array(6) {
[0]=>
array(5) {
["a"]=>
int(1)
["b"]=>
int(20)
["c"]=>
int(1)
["d"]=>
int(0)
["name"]=>
string(2) "a1"
}
[1]=>
array(5) {
["a"]=>
int(1)
["b"]=>
int(2)
["c"]=>
int(20)
["d"]=>
int(3)
["name"]=>
string(2) "a6"
}
[2]=>
array(5) {
["a"]=>
int(1)
["b"]=>
int(2)
["c"]=>
int(20)
["d"]=>
int(31)
["name"]=>
string(2) "a3"
}
[3]=>
array(5) {
["a"]=>
int(1)
["b"]=>
int(2)
["c"]=>
int(20)
["d"]=>
int(35)
["name"]=>
string(2) "a2"
}
[4]=>
array(5) {
["a"]=>
NULL
["b"]=>
int(2)
["c"]=>
int(1)
["d"]=>
int(30)
["name"]=>
string(2) "a4"
}
[5]=>
array(5) {
["a"]=>
int(0)
["b"]=>
int(2)
["c"]=>
int(10)
["d"]=>
int(13)
["name"]=>
string(2) "a5"
}
}