zoukankan      html  css  js  c++  java
  • PHP 二维数组根据某个字段排序

    二维数组根据某个字段排序有两种办法,一种是通过sort自己写代码,一种是直接用array_multisort排序函数

    一. 手写arraysort 

    PHP的一维数组排序函数:

    sort  对数组的值按照升序排列(rsort降序),不保留原始的键

    ksort 对数组的键按照升序排列(krsort降序) 保留键值关系

    asort 对数组的值按照升序排列(arsort降序),保留键值关系

    方法: 取出要排序的值组成值数组(为一维数组),按要求对值进行排序(保持键值关系),遍历值数组,按照键对应赋值给结果数组。

    function arraySort($array,$keys,$sort='asc') {
        $newArr = $valArr = array();
        foreach ($array as $key=>$value) {
            $valArr[$key] = $value[$keys];
        }
        ($sort == 'asc') ?  asort($valArr) : arsort($valArr);
        reset($valArr);
        foreach($valArr as $key=>$value) {
            $newArr[$key] = $array[$key];
        }
        return $newArr;
    }

    二. 通过array_multisort 进行数组字段排序

    这里也是本篇主要要说的。

    官网对array_multisort函数的解释: 对多个数组或多维数组进行排序

    bool array_multisort ( array $ar1 [, mixed $arg [, mixed $... [, array $... ]]] )

    成功时返回 TRUE, 或者在失败时返回 FALSE.

    array_multisort() 可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。关联(string)键名保持不变,但数字键名会被重新索引。

    输入数组被当成一个表的列并以行来排序——这类似于 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话就按照下一个输入数组中相应值的大小来排序,依此类推。

    本函数的参数结构有些不同寻常,但是非常灵活。第一个参数必须是一个数组。接下来的每个参数可以是数组或者是下面列出的排序标志。

    排序顺序标志:

    • SORT_ASC - 按照上升顺序排序
    • SORT_DESC - 按照下降顺序排序

    排序类型标志:

    • SORT_REGULAR - 将项目按照通常方法比较
    • SORT_NUMERIC - 将项目按照数值比较
    • SORT_STRING - 将项目按照字符串比较

    每个数组之后不能指定两个同类的排序标志。每个数组后指定的排序标志仅对该数组有效 - 在此之前为默认值 SORT_ASC 和 SORT_REGULAR

    例1:

    $ar1 = array("10", 101, 100, 6);
    $ar2 = array(1, 3, 6, 5);
    array_multisort($ar1, $ar2);
    print_r($ar1);
    print_r($ar2);

    第二个数组中的项目顺序完全和第一个数组中相应的项目顺序一致。

    Array
    (
        [0] => 6
        [1] => 10
        [2] => 100
        [3] => 101
    )
    Array
    (
        [0] => 5
        [1] => 1
        [2] => 6
        [3] => 3
    )

    例2:

    $ar = array(
        array("b10", 'c11', 101, 100, "a"),
        array(1, 2, "2", 9, 5)
    );
    array_multisort($ar[0], SORT_ASC, SORT_STRING, $ar[1], SORT_NUMERIC, SORT_DESC);
    print_r($ar);

    经过排序后,第一个数组将包含 "b10", 'c11',101,100,"a"(作为字符串上升排序),第二个数组将包含 1,2,"2",9,5(作为数值下降排序)。

    Array
    (
        [0] => Array
            (
                [0] => 100
                [1] => 101
                [2] => a
                [3] => b10
                [4] => c11
            )
    
        [1] => Array
            (
                [0] => 9
                [1] => 2
                [2] => 5
                [3] => 1
                [4] => 2
            )
    
    )

    例3:(我们要的结果)

    $data[] = array('customer_name' => '小李', 'money' => 12, 'distance' => 2, 'address' => '长安街C坊');
    $data[] = array('customer_name' => '王晓', 'money' => 30, 'distance' => 10, 'address' => '北大街30号');
    $data[] = array('customer_name' => '赵小雅', 'money' => 89, 'distance' => 6, 'address' => '解放路恒基大厦A座');
    $data[] = array('customer_name' => '小月', 'money' => 150, 'distance' => 5, 'address' => '天桥十字东400米');
    $data[] = array('customer_name' => '李亮亮', 'money' => 45, 'distance' => 26, 'address' => '天山西路198弄');
    $data[] = array('customer_name' => '董娟', 'money' => 67, 'distance' => 17, 'address' => '新大南路2号');
    
    // 取得列的列表
    foreach ($data as $key => $row) {
        $distance[$key] = $row['distance'];
        $money[$key] = $row['money'];
    }
    array_multisort($distance, SORT_DESC, $data);
    
    print_r($data);

    $data包含有行的数组,但是 array_multisort() 需要一个包含列的数组,因此用foreach来取得列,然后排序。

    所有,我们将array_multisort() 封装下:

    /**
     * 二维数组根据某个字段排序
     * @param array $array 要排序的数组
     * @param string $keys   要排序的键字段
     * @param string $sort  排序类型  SORT_ASC     SORT_DESC 
     * @return array 排序后的数组
     */
    function arraySort($array, $keys, $sort = SORT_DESC) {
        $keysValue = [];
        foreach ($array as $k => $v) {
            $keysValue[$k] = $v[$keys];
        }
        array_multisort($keysValue, $sort, $array);
        return $array;
    }

    继续使用上例中的$data 数组

    # 按距离降序排序
    $a = arraySort($data, 'distance', SORT_DESC);
    print_r($a);
    # 按money升序排序
    $b = arraySort($data, 'money', SORT_ASC);
    print_r($b);

    效果:

    Array
    (
        [0] => Array
            (
                [customer_name] => 李亮亮
                [money] => 45
                [distance] => 26
                [address] => 天山西路198弄
            )
    
        [1] => Array
            (
                [customer_name] => 董娟
                [money] => 67
                [distance] => 17
                [address] => 新大南路2号
            )
    
        [2] => Array
            (
                [customer_name] => 王晓
                [money] => 30
                [distance] => 10
                [address] => 北大街30号
            )
    
        [3] => Array
            (
                [customer_name] => 赵小雅
                [money] => 89
                [distance] => 6
                [address] => 解放路恒基大厦A座
            )
    
        [4] => Array
            (
                [customer_name] => 小月
                [money] => 150
                [distance] => 5
                [address] => 天桥十字东400米
            )
    
        [5] => Array
            (
                [customer_name] => 小李
                [money] => 12
                [distance] => 2
                [address] => 长安街C坊
            )
    
    )
    Array
    (
        [0] => Array
            (
                [customer_name] => 李亮亮
                [money] => 45
                [distance] => 26
                [address] => 天山西路198弄
            )
    
        [1] => Array
            (
                [customer_name] => 董娟
                [money] => 67
                [distance] => 17
                [address] => 新大南路2号
            )
    
        [2] => Array
            (
                [customer_name] => 王晓
                [money] => 30
                [distance] => 10
                [address] => 北大街30号
            )
    
        [3] => Array
            (
                [customer_name] => 赵小雅
                [money] => 89
                [distance] => 6
                [address] => 解放路恒基大厦A座
            )
    
        [4] => Array
            (
                [customer_name] => 小月
                [money] => 150
                [distance] => 5
                [address] => 天桥十字东400米
            )
    
        [5] => Array
            (
                [customer_name] => 小李
                [money] => 12
                [distance] => 2
                [address] => 长安街C坊
            )
    
    )
    Array
    (
        [0] => Array
            (
                [customer_name] => 小李
                [money] => 12
                [distance] => 2
                [address] => 长安街C坊
            )
    
        [1] => Array
            (
                [customer_name] => 王晓
                [money] => 30
                [distance] => 10
                [address] => 北大街30号
            )
    
        [2] => Array
            (
                [customer_name] => 李亮亮
                [money] => 45
                [distance] => 26
                [address] => 天山西路198弄
            )
    
        [3] => Array
            (
                [customer_name] => 董娟
                [money] => 67
                [distance] => 17
                [address] => 新大南路2号
            )
    
        [4] => Array
            (
                [customer_name] => 赵小雅
                [money] => 89
                [distance] => 6
                [address] => 解放路恒基大厦A座
            )
    
        [5] => Array
            (
                [customer_name] => 小月
                [money] => 150
                [distance] => 5
                [address] => 天桥十字东400米
            )
    
    )
  • 相关阅读:
    Linux下查看某个命令的参数
    Vue
    SpringBoot vue
    Axios 中文说明
    一个很有趣的示例Spring Boot项目,使用Giraphe CMS和Spring Boot
    微信公众号 文章的爬虫系统
    为RecyclerView添加item的点击事件
    Android NineGridLayout — 仿微信朋友圈和QQ空间的九宫格图片展示自定义控件
    今日头条 --新闻阅读器
    int android.support.v7.widget.RecyclerView$ViewHolder.mItemViewType' on a null.....
  • 原文地址:https://www.cnblogs.com/dcb3688/p/4608004.html
Copyright © 2011-2022 走看看