• 周蓬安.blog的博客—强国博客—人民网 2019-05-10
  • 紫光阁中共中央国家机关工作委员会 2019-05-10
  • 感触名家笔下的端午文化吃香粽原来可以这样文艺 2019-05-09
  • 追梦夺冠游行嘲讽詹皇 百万人面前穿订制T恤羞辱他 2019-04-27
  • 《瘟疫传说》:黑死病恐怖 姐弟在绝望中求生 2019-04-10
  • 陕西国防工业职业技术学院百名大学生志愿者敬老院慰问孤寡老人陕西国防工业职业技术学院百名大学生志愿者敬老院慰问-陕西教育新闻 2019-04-08
  • 西藏拉萨:新家园 新生活 2019-04-08
  • 尊重和保障宗教信仰自由的中国实践 2019-04-06
  • 一敬泯恩仇 俄罗斯队主帅这个动作太暖了 2019-03-20
  • 四大名著剧组首次同台忆往事 经典影视剧如何铸就? 2018-12-07
  • “天眼”凝望 探秘宇宙 2018-12-07
  • 0

    php中对二维数组进行排序

    Posted by 撒得一地 on 2016年1月16日 in PHP笔记
    国外稳定加速器推荐    Express | Vypr

    一维数组排序可以使用asort、ksort等一些方法进程排序,相对来说比较简单。二维数组的排序怎么实现呢?使用array_multisort和usort可以实现例如像下面的数组:

     代码如下:

    $users = array(
        array('name' => 'tom', 'age' => 20),
        array('name' => 'anny', 'age' => 18),
        array('name' => 'jack', 'age' => 22)
    );
    

    上面的二维数组中,如果希望能按照age从小到大进行排序,那么可以怎么做呢?下面整理了两个方法出来,分享给大家。

    1、使用array_multisort

    使用这个方法,会比较麻烦些,要将age提取出来存储到一维数组里,然后按照age升序排列。具体代码如下:
    完整代码如下:

    <?php
    $users = array(
        array('name' => 'tom', 'age' => 20),
        array('name' => 'anny', 'age' => 18),
        array('name' => 'jack', 'age' => 22)
    );
    
    $ages = array();
    
    foreach ($users as $user) {
        $ages[] = $user['age'];
    }
    
    array_multisort($ages, SORT_ASC, $users);
    print_r($users);
    ?>
    

    上面排完序后输出结果:

    Array
    (
        [0] => Array
            (
                [name] => anny
                [age] => 18
            )
        [1] => Array
            (
                [name] => tom
                [age] => 20
            )
        [2] => Array
            (
                [name] => jack
                [age] => 22
            )
    )
    

    如果需要先按年龄升序排列,再按照名称升序排列,方法同上,就是多提取一个名称数组出来,最后的排序方法这样调用:

    代码如下:

    <?php
    $users = array(
        array('name' => 'tom', 'age' => 20),
        array('name' => 'anny', 'age' => 18),
        array('name' => 'jack', 'age' => 22)
    );
    
    $ages = array();
    $names = array();
    
    foreach ($users as $user) {
        $ages[] = $user['age'];
    }
    
    foreach ($users as $user) {
        $names[] = $user['name'];
    }
    
    array_multisort($ages, SORT_ASC, $names, SORT_ASC, $users);
    print_r($users);
    ?>
    

    上面排完序后,最后输出结果:

    Array
    (
        [0] => Array
            (
                [name] => anny
                [age] => 18
            )
        [1] => Array
            (
                [name] => tom
                [age] => 20
            )
        [2] => Array
            (
                [name] => jack
                [age] => 22
            )
    )
    

    2、使用usort
     
    使用这个方法最大的好处就是可以自定义一些比较复杂的排序方法。例如按照名称的长度降序排列:
     
    代码如下:

    usort($users, function($a, $b) {
                $al = strlen($a['name']);
                $bl = strlen($b['name']);
    
                if ($al == $bl)
                    return 0;
                return ($al > $bl) ? -1 : 1;
            });
    

    这里使用了匿名函数,如果有需要也可以单独提取出来。其中$a, $b可以理解为$users数组下的元素,可以直接索引name值,并计算长度,而后比较长度就可以了。上面定义的是按name元素长度进行排序,长度越长排在越前面。

    如果想按年龄进行升序排序,则可以写成这样:

    usort($users, function($a, $b) {
    
                $al = $a['age'];
                $bl = $b['age'];
    
                if ($al == $bl)
                    return 0;
    
                return ($al < $bl) ? -1 : 1;
            });
    

    我更喜欢第二种方法,因为少了提取排序内容到一维数组的步骤,而且排序方法更为灵活。

    标签:

    上一篇:

    下一篇:

    相关推荐

    发表评论

    电子邮件地址不会被公开。 必填项已用*标注

    4 + 3 = ?

    网站地图|广东快乐10分开奖直播

    Copyright © 2015-2019 广东快乐10分开奖直播 All rights reserved.
    闽ICP备15015576号-1,版权所有?psz.

  • 周蓬安.blog的博客—强国博客—人民网 2019-05-10
  • 紫光阁中共中央国家机关工作委员会 2019-05-10
  • 感触名家笔下的端午文化吃香粽原来可以这样文艺 2019-05-09
  • 追梦夺冠游行嘲讽詹皇 百万人面前穿订制T恤羞辱他 2019-04-27
  • 《瘟疫传说》:黑死病恐怖 姐弟在绝望中求生 2019-04-10
  • 陕西国防工业职业技术学院百名大学生志愿者敬老院慰问孤寡老人陕西国防工业职业技术学院百名大学生志愿者敬老院慰问-陕西教育新闻 2019-04-08
  • 西藏拉萨:新家园 新生活 2019-04-08
  • 尊重和保障宗教信仰自由的中国实践 2019-04-06
  • 一敬泯恩仇 俄罗斯队主帅这个动作太暖了 2019-03-20
  • 四大名著剧组首次同台忆往事 经典影视剧如何铸就? 2018-12-07
  • “天眼”凝望 探秘宇宙 2018-12-07
  • 江苏15选5开奖结果 福彩论坛彩票论坛 腾讯彩票中心网 足彩胜负彩过关统计 浙江体彩6+1规则 手机怎么玩快速时时彩 澳洲幸运10官方网站 打麻将必胜绝技 福利彩票双色球玩法 七乐彩开奖直播 老时时彩360开奖视频 福彩老时时彩第 北京pk10投注十大平台 36选7的体育彩票走势图 竞彩足球混合过关开奖 黑龙江时时彩开奖投注