几个经过封装的方法:
1.使用 array_multisort() 函数
<?php $arr = [ ['name'=>'dee','age'=>28], ['name'=>'emperor', 'age'=>30], ['name'=>'Lee', 'age'=>32], ['name'=>'Arshavin', 'age'=>33], ['name'=>'Totti', 'age'=>40] ]; $arr2 = [ ['name'=>'Ozil', 'age'=>27], ['name'=>'CR7', 'age'=>29], ['name'=>'Doctor', 'age'=>33], ['name'=>'John', 'age'=>35] ]; function multi_array_sort($multi_array, $sort_key, $sort = SORT_DESC) { if (is_array($multi_array)) { foreach ($multi_array as $row_array) { if (is_array($row_array)) { $key_array[] = $row_array[$sort_key]; } else { return FALSE; } } } else { return FALSE; } array_multisort($key_array, $sort, $multi_array); return $multi_array; } $arr = array_merge($arr, $arr2); $arr = multi_array_sort($arr, 'age', SORT_ASC); echo '<pre>'; print_r($arr);
说明:在 multi_array_sort 的自定义方法中,$key_array 完成对年龄的一维数组的排序,再使用 array_multisort() 函数对原数组进行排序。
bool array_multisort ( array &$arr [, mixed $arg = SORT_ASC [, mixed $arg = SORT_REGULAR [, mixed $... ]]] )
array_multisort() 可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。输入数组被当成一个表的列并以行来排序——这类似于 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话就按照下一个输入数组中相应值的大小来排序,依此类推。
2. 使用临时数组存储需要排序的字段,经过排序后,通过在 froeach 循环中 $new_array[] = $arr[$k]; 把经过排序的字段数组的索引值作为原始数组的索引值存储至新的数组
<?php $arr = [ ['name'=>'dee','age'=>28], ['name'=>'emperor', 'age'=>30], ['name'=>'Lee', 'age'=>32], ['name'=>'Arshavin', 'age'=>33], ['name'=>'Totti', 'age'=>40] ]; $arr2 = [ ['name'=>'Ozil', 'age'=>27], ['name'=>'CR7', 'age'=>29], ['name'=>'Doctor', 'age'=>33], ['name'=>'John', 'age'=>35] ]; function array_sort($arr, $keys, $type = 'asc') { $keysvalue = $new_array = array(); foreach ($arr as $k => $v) { $keysvalue[$k] = $v[$keys]; } if ($type == 'asc') { asort($keysvalue); } else { arsort($keysvalue); } reset($keysvalue); foreach ($keysvalue as $k => $v) { $new_array[] = $arr[$k]; } return $new_array; } $arr = array_merge($arr, $arr2); $arr = array_sort($arr, 'age'); echo '<pre>'; print_r($arr);
3. 和 2 差不多,多了些验证
<?php $arr = [ ['name'=>'dee','age'=>28], ['name'=>'emperor', 'age'=>30], ['name'=>'Lee', 'age'=>32], ['name'=>'Arshavin', 'age'=>33], ['name'=>'Totti', 'age'=>40] ]; $arr2 = [ ['name'=>'Ozil', 'age'=>27], ['name'=>'CR7', 'age'=>29], ['name'=>'Doctor', 'age'=>33], ['name'=>'John', 'age'=>35] ]; function array_sort($array,$keys,$type='asc'){ if(!isset($array) || !is_array($array) || empty($array)){ return ''; } if(!isset($keys) || trim($keys)==''){ return ''; } if(!isset($type) || $type=='' || !in_array(strtolower($type),array('asc','desc'))){ return ''; } $keysvalue=array(); foreach($array as $key=>$val){ $keysvalue[] =$val[$keys]; } asort($keysvalue); //key值排序 reset($keysvalue); //指针重新指向数组第一个 foreach($keysvalue as $key=>$vals) { $keysort[] = $key; } $keysvalue = array(); $count=count($keysort); if(strtolower($type) != 'asc'){ for($i=$count-1; $i>=0; $i--) { $keysvalue[] = $array[$keysort[$i]]; } }else{ for($i=0; $i<$count; $i++){ $keysvalue[] = $array[$keysort[$i]]; } } return $keysvalue; } $arr = array_merge($arr, $arr2); $arr = array_sort($arr, 'age'); echo '<pre>'; print_r($arr);