PHP多维数组按照某一个键值进行排序

假设:$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;
}
发布了18 篇原创文章 · 获赞 1 · 访问量 7007

猜你喜欢

转载自blog.csdn.net/weixin_42188216/article/details/102607282
今日推荐