【PHP】多维数组多个字段排序
对于多维数组,如何针对多个字段进行排序。
例如:
$array1 = array(
0=>array('id'=>8,'name'=>'Apple','age'=> 18),
1=>array('id'=>8,'name'=>'Bed','age'=>17),
2=>array('id'=>5,'name'=>'Cos','age'=>16),
3=>array('id'=>5,'name'=>'Cos','age'=>14)
);
需要先对`id`进行排序,然后依据排序结果,再对`name`进行排序,最后再对`age`进行排序。
先构造函数:
private function _sortArrByManyField()
{
$args = func_get_args();
if(empty($args)){
return null;
}
$arr = array_shift($args);
foreach($args as $key => $value){
if(is_string($value)){
$temp = array();
foreach($arr as $k=> $v){
$temp[$k] = $v[$value];
}
$args[$key] = $temp;
}
}
$args[] = &$arr;
call_user_func_array('array_multisort',$args);
return array_pop($args);
}
调用函数:
$arr = sortArrByManyField($array1,'id',SORT_ASC,'name',SORT_ASC,'age',SORT_DESC);
最后结果:
array(4) {
[0]=>array(3) {
["id"]=>int(5)
["name"]=>string(3) "Cos"
["age"]=>int(16)
}
[1]=>array(3) {
["id"]=>int(5)
["name"]=>string(3) "Cos"
["age"]=>int(14)
}
[2]=>array(3) {
["id"]=>int(8)
["name"]=>string(5) "Apple"
["age"]=>int(18)
}
[3]=>array(3) {
["id"]=>int(8)
["name"]=>string(3) "Bed"
["age"]=>int(17)
}
}
解析:
`func_get_args()`返回一个数组,其中每个元素都是目前用户自定义函数的参数列表的相应元素的副本。
`call_user_func_array()`把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr索引数组)为回调函数的的参数传入。
`array_multisort()` 参数:bool array_multisort ( array &$arr [, mixed $arg = SORT_ASC [, mixed $arg = SORT_REGULAR [, mixed $... ]]] ),可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。
关联(string)键名保持不变,但数字键名会被重新索引。
排序顺序标志:1.SORT_ASC - 按照上升顺序排序。 2.SORT_DESC - 按照下降顺序排序。
排序类型标志:1.SORT_REGULAR - 将项目按照通常方法比较。2.SORT_NUMERIC - 将项目按照数值比较。3.SORT_STRING - 将项目按照字符串比较。
输入数组被当成一个表的列并以行来排序——这类似于 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话就按照下一个输入数组中相应值的大小来排序,依此类推。
`array_pop()`弹出并返回 array 数组的最后一个单元,并将数组 array 的长度减一。如果 array 为空(或者不是数组)将返回 NULL。 此外如果被调用不是一个数则会产生一个 Warning。