在PHP中,对各种数组排序,归功于数组函数 sort()、ksort()、rsort()、asort()...等,使用他们进行各种排序,但是用于多维数组就没那么方便简单。这篇文章介绍 usort() 和 array_multisort() 处理多维数组排序。
对于多维纬度排序使用usort()函数(自定义的比较函数对数组中的元素进行排序);
如:对2纬数组的排序
$arr=[
['k1'=>'11','k2'=>'d'],
['k1'=>'64','k2'=>'dd'],
['k1'=>'32','k2'=>'ddd']
];
根据数组里面k1的值小到大排序。
function num_sort($x,$y){
if($x['k1']>$y['k1']){
return true; //true 就交换位置
}elseif($x['k1']<$y['k2']){
return false; //false 就不交换位置
}else{
return 0; // 0 就不变
}
}
usort($arr,'num_sort');
得到的结果可以看出对数组k1小到大排序好了
如果想保持 键值关系,可以用 uasort() 函数
uasort($arr,'num_sort');
usort 函数使用自定义函数 对数组排序,自定义函数可以根据自己的需求去写,如这次我想要根据k2的长度来排序
function str_sort($x,$y){
if(strlen($x['k2'])>strlen($y['k1'])){
return true;
}else{
return false;
}
}
uasort($arr,'str_sort');
三纬数组同样用法,主要看自定义函数的编写
$arr = [
[['k1'=>'4','k2'=>'dd']],
[['k1'=>'15','k2'=>'ddd']],
[['k1'=>'42','k2'=>'d']],
];
function num_sort($x,$y){
if($x[0]['k1']>$y[0]['k1']){
return true;
}elseif($x[0]['k1']<$y[0]['k2']){
return false;
}else{
return 0;
}
}
usort($arr,'num_sort'); //对三纬数组 的k1值排序
多纬数组的排序也可以用 array_multisort() 函数
array_multisort() 要先提取出至少一个 一纬数组,根据一纬数组的排序来排序多维数组
array_multisort(array1,array2,array3...)
- SORT_ASC - 默认,按升序排列。(A-Z)
- SORT_DESC - 按降序排列。(Z-A)
$arr = [
['k1'=>'4','k2'=>'a'],
['k1'=>'41','k2'=>'b'],
['k1'=>'15','k2'=>'c'],
['k1'=>'4','k2'=>'d'],
];
foreach ($arr as $key => $value) {
$num[] = $value['k1'];
$str[] = $value['k2'];
}
array_multisort($num, SORT_ASC,$str,SORT_DESC,$arr); //先提取出一纬数组,按照$num升序,如果元素相同,则按照$str降序
$arr:
总结: usort() 更灵活,自定义函数排序,array_multisort() 先提取出一纬数组,根据一纬数组排序。