假设:$array=[['id'=>1,'sort'=>20],['id'=>2,'sort'=>10],['id'=>3,'sort'=>20]],对该数组中sort的大小进行排序。
有两种方法,比较建议方法1。
方法1:(推荐!不会丢失数据)
/** * 多维数组的按照某一个键值进行排序(默认升序排列) * @param $array array 被排序数组 * @param $key_name string 数组键名 * @param $order string desc|asc 升序或者降序 * @return array 返回排序后的数组 * 例子:传入数组 $array=array(array('id'=>1,'sort'=>20),array('id'=>2,'sort'=>10),array('id'=>3,'sort'=>20)); * gw_sort($array,'sort','asc'); */ public function arr_key_sort($array,$key_name,$order="asc") { $arr_nums = $arr = array(); foreach ($array as $k => $v) { $arr_nums[$k] = $v[$key_name]; //将排序的键值取出 } if($order == "asc") {//对键值进行排序,并保留索引 asort($arr_nums); } else { arsort($arr_nums); } foreach ($arr_nums as $k => $v) { $arr[] = $array[$k];//按照跑留的索引进行赋值 } return $arr; }
方法2:( 注意:如果需要排序的值有重复的,会丢失!)
/** * 多维数组的按照某一个键值进行排序(默认升序排列) * @param $array array 被排序数组 * @param $key_name string 数组键名 * @param $sort string desc|asc 升序或者降序 * @return array 返回排序后的数组 * 例子:传入数组 $array=array(array('id'=>1,'sort'=>20),array('id'=>2,'sort'=>10),array('id'=>3,'sort'=>30)); * 注意:如果sort的值有重复的,会丢失! * gw_sort($array,'sort','asc'); */ public function arr_key_sort($array,$key_name,$sort){ $key_name_array = array();//保存被排序数组键名 foreach($array as $key=>$val){ $key_name_array[] = $val[$key_name]; } if($sort=="desc"){ rsort($key_name_array); }else if($sort=="asc"){ sort($key_name_array); } $key_name_array = array_flip($key_name_array);//反转键名和值得到数组排序后的位置,array_flip()如果同一个值出现多次,则最后一个键名将作为它的值,其它键会被丢弃。https://www.php.net/manual/zh/function.array-flip.php,了解如何使用这函数 $result = array(); foreach($array as $k=>$v){ $this_key_name_value = $v[$key_name];//当前数组键名值依次是20,10,30 $save_position = $key_name_array[$this_key_name_value];//获取20,10,30排序后存储位置 $result[$save_position] = $v;//当前项存储到数组指定位置 } ksort($result); return $result; }