PHP二维数组排序
一、
1.
$arrays 要排序的数组
$sort_key 根据排序的key
$sort_order 升序降序 SORT_ASC/SORT_DESC
$sort_type 排序key类型 SORT_NUMERIC/SORT_STRING
返回值:重新排列后的数组
function my_sort($arrays,$sort_key,$sort_order=SORT_ASC,$sort_type=SORT_NUMERIC ){
if(is_array($arrays)){
foreach ($arrays as $array){
if(is_array($array)){
$key_arrays[] = $array[$sort_key];
}else{
return false;
}
}
}else{
return false;
}
array_multisort($key_arrays,$sort_order,$sort_type,$arrays);
return $arrays;
}
2.
//$array 要排序的数组
//$row 排序依据列
//$type 排序类型[asc or desc]
//return 排好序的数组
function array_sort($array,$row,$type){
$array_temp = array();
foreach($array as $v){
$array_temp[$v[$row]] = $v;
}
if($type == 'asc'){
ksort($array_temp);
}elseif($type='desc'){
krsort($array_temp);
}else{
}
return array_values($array_temp);
}
二、
$arr = array(
0=>array('id'=>5,'name'=>'小明','num'=> 14),
1=>array('id'=>5,'name'=>'小李','num'=>52),
2=>array('id'=>4,'name'=>'小花','num'=>36),
3=>array('id'=>6,'name'=>'小李','num'=>14)
);
采用php中的func_get_args函数,来动态获取传入的值,解决多字段排序。实现如下:
/**
* 多维数组指定多字段排序
* 排序:SORT_ASC升序 , SORT_DESC降序
* 示例:$this->multiaArraySort($arr, 'num', SORT_DESC, 'sort', SORT_ASC)
* @return array
*/
public function multiaArraySort()
{
$funcArgs = func_get_args();
if(empty($funcArgs)){
return null;
}
$arr = array_shift($funcArgs);
if(!is_array($arr)){
throw new Exception('第一个参数必须为数组');
}
foreach($funcArgs as $key => $value){
if(is_string($value)){
$tempArr = array();
foreach($arr as $k=> $v){
$tempArr[$k] = $v[$value];
}
$funcArgs[$key] = $tempArr;
}
}
$funcArgs[] = &$arr;
call_user_func_array('array_multisort', $funcArgs);
return array_pop($funcArgs);
}
// 执行
$arr = $this->multiaArraySort($arr, 'id', SORT_DESC, 'num', SORT_DESC);
var_dump($arr);
运行结果如下:
array (size=4)
0 =>
array (size=3)
'id' => int 6
'name' => string '小李' (length=6)
'num' => int 14
1 =>
array (size=3)
'id' => int 5
'name' => string '小李' (length=6)
'num' => int 52
2 =>
array (size=3)
'id' => int 5
'name' => string '小明' (length=6)
'num' => int 14
3 =>
array (size=3)
'id' => int 4
'name' => string '小花' (length=6)
'num' => int 36