PHP二维数组排序的3种方法和自定义函数分享


Posted in PHP onApril 09, 2014

关于排序一般我们都是通过数据库或者nosql(eg:redis)先排好序然后输出到程序里直接使用,但是有些时候我们需要通过PHP直接来对数组进行排序,而在PHP里存储数据用到最多的就是对象和数组,但处理较多的就是数组,因为有非常丰富的内置函数库(其实对象一定程度上也可以理解为是数组),这些函数库很大程度上可以帮助我们实现某些功能。常用的系统函数有sort、asort、arsort、ksort、krsort等等,这里我主要说下对二维数组的排序,两种方法:

一、用PHP自带array_multisort函数排序

<?php
    $data = array();
    $data[] = array('volume' => 67, 'edition' => 2);
    $data[] = array('volume' => 86, 'edition' => 1);
    $data[] = array('volume' => 85, 'edition' => 6);
    $data[] = array('volume' => 98, 'edition' => 2);
    $data[] = array('volume' => 86, 'edition' => 6);
    $data[] = array('volume' => 67, 'edition' => 7);
    // 取得列的列表
    foreach ($data as $key => $row)
    {
        $volume[$key]  = $row['volume'];
        $edition[$key] = $row['edition'];
    }
    array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
    print_r($data);
?>

输出结果:

Array
(
    [0] => Array
        (
            [volume] => 98
            [edition] => 2
        )
    [1] => Array
        (
            [volume] => 86
            [edition] => 1
        )
    [2] => Array
        (
            [volume] => 86
            [edition] => 6
        )
    [3] => Array
        (
            [volume] => 85
            [edition] => 6
        )
    [4] => Array
        (
            [volume] => 67
            [edition] => 2
        )
    [5] => Array
        (
            [volume] => 67
            [edition] => 7
        )
)

关于array_multisort官方文档也有比较详细的说明:http://www.php.net/manual/zh/function.array-multisort.php

二、自定义函数排序1

<?php
    $data = array();
    $data[] = array('volume' => 67, 'edition' => 2);
    $data[] = array('volume' => 86, 'edition' => 1);
    $data[] = array('volume' => 85, 'edition' => 6);
    $data[] = array('volume' => 98, 'edition' => 2);
    $data[] = array('volume' => 86, 'edition' => 6);
    $data[] = array('volume' => 67, 'edition' => 7);
    // 取得列的列表
    foreach ($data as $key => $row)
    {
        $volume[$key]  = $row['volume'];
        $edition[$key] = $row['edition'];
    }
    $ret = arraySort($data, 'volume', 'desc');
    print_r($ret);
    /**
     * @desc arraySort php二维数组排序 按照指定的key 对数组进行排序
     * @param array $arr 将要排序的数组
     * @param string $keys 指定排序的key
     * @param string $type 排序类型 asc | desc
     * @return array
     */
    function arraySort($arr, $keys, $type = 'asc') {
        $keysvalue = $new_array = array();
        foreach ($arr as $k => $v){
            $keysvalue[$k] = $v[$keys];
        }
        $type == 'asc' ? asort($keysvalue) : arsort($keysvalue);
        reset($keysvalue);
        foreach ($keysvalue as $k => $v) {
           $new_array[$k] = $arr[$k];
        }
        return $new_array;
    }
?>

输出结果:
Array
(
    [3] => Array
        (
            [volume] => 98
            [edition] => 2
        )
    [4] => Array
        (
            [volume] => 86
            [edition] => 6
        )
    [1] => Array
        (
            [volume] => 86
            [edition] => 1
        )
    [2] => Array
        (
            [volume] => 85
            [edition] => 6
        )
    [5] => Array
        (
            [volume] => 67
            [edition] => 7
        )
    [0] => Array
        (
            [volume] => 67
            [edition] => 2
        )
)

这个自定义函数与系统函数的一个区别就是:自定义函数只支持针对某一个key的排序,如果要支持多个key的排序需要执行多次; 而系统函数array_multisort可以一次性对多个key且可以指定多个排序规则,系统函数还是相当强大的,推荐使用系统函数,毕竟是C底层实现的,这里只是举例说明如果通过自定义函数来对数组进行排序,当然这个自定义函数也可以继续扩展来支持更多的排序规则。在取排名、排行榜、成绩等场景中用到的还是非常多的。

三、自定义函数排序2

以下函数是对一个给定的二维数组按照指定的键值进行排序,先看函数定义:

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[$k] = $arr[$k];
 }
 return $new_array; 
}

它可以对二维数组按照指定的键值进行排序,也可以指定升序或降序排序法(默认为升序),用法示例:
$array = array(
 array('name'=>'手机','brand'=>'诺基亚','price'=>1050),
 array('name'=>'笔记本电脑','brand'=>'lenovo','price'=>4300),
 array('name'=>'剃须刀','brand'=>'飞利浦','price'=>3100),
 array('name'=>'跑步机','brand'=>'三和松石','price'=>4900),
 array('name'=>'手表','brand'=>'卡西欧','price'=>960),
 array('name'=>'液晶电视','brand'=>'索尼','price'=>6299),
 array('name'=>'激光打印机','brand'=>'惠普','price'=>1200)
);
$ShoppingList = array_sort($array,'price');
print_r($ShoppingList);

上面是对$array这个二维数组按照'price'从低到高的排序。

 

PHP 相关文章推荐
Oracle Faq(Oracle的版本)
Oct 09 PHP
PHP静态新闻列表自动生成代码
Jun 14 PHP
php实现单链表的实例代码
Mar 22 PHP
PHP中模拟处理HTTP PUT请求的例子
Jul 22 PHP
Laravel 5框架学习之Laravel入门和新建项目
Apr 07 PHP
WordPress迁移时一些常见问题的解决方法整理
Nov 24 PHP
基于php实现七牛抓取远程图片
Dec 01 PHP
PHP浮点数的一个常见问题
Mar 10 PHP
PHP实现微信支付(jsapi支付)流程步骤详解
Mar 15 PHP
PHP中抽象类,接口功能、定义方法示例
Feb 26 PHP
laravel 修改记住我功能的cookie保存时间的方法
Oct 14 PHP
如何在Laravel5.8中正确地应用Repository设计模式
Nov 26 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
Apr 09 #PHP
PHP扩展模块Pecl、Pear以及Perl的区别
Apr 09 #PHP
排序算法之PHP版快速排序、冒泡排序
Apr 09 #PHP
PHP读取大文件的类SplFileObject使用介绍
Apr 09 #PHP
php解决约瑟夫环示例
Apr 09 #PHP
适用于抽奖程序、随机广告的PHP概率算法实例
Apr 09 #PHP
PHP父类调用子类方法的代码例子
Apr 09 #PHP
You might like
PHP笔记之:日期函数的使用介绍
2013/04/24 PHP
php获取本周开始日期和结束日期的方法
2015/03/09 PHP
WordPress开发中用于获取近期文章的PHP函数使用解析
2016/01/05 PHP
PHP/ThinkPHP实现批量打包下载文件的方法示例
2017/07/31 PHP
jquery实现的树形目录实例
2015/06/26 Javascript
Bootstrap选项卡动态切换效果
2016/11/28 Javascript
jquery.zclip轻量级复制失效问题
2017/01/08 Javascript
vue实现ajax滚动下拉加载,同时具有loading效果(推荐)
2017/01/11 Javascript
基于Vue渲染与插件的加载顺序的问题详解
2018/03/05 Javascript
使用JavaScript保存文本文件到本地的两种方法
2019/01/22 Javascript
谈谈JavaScript中super(props)的重要性
2019/02/12 Javascript
vue路由导航守卫和请求拦截以及基于node的token认证的方法
2019/04/07 Javascript
详解Vue-cli3.X使用px2rem遇到的问题
2019/08/09 Javascript
Element 默认勾选表格 toggleRowSelection的实现
2019/09/04 Javascript
Vue实现兄弟组件间的联动效果
2020/01/21 Javascript
vue实现评价星星功能
2020/06/30 Javascript
Vue.js原理分析之nextTick实现详解
2020/09/07 Javascript
pandas.DataFrame 根据条件新建列并赋值的方法
2018/04/08 Python
Python实现的NN神经网络算法完整示例
2018/06/19 Python
Python实现随机漫步功能
2018/07/09 Python
浅析python的优势和不足之处
2018/11/20 Python
Python实现Event回调机制的方法
2019/02/13 Python
pytorch中的embedding词向量的使用方法
2019/08/18 Python
Python使用Slider组件实现调整曲线参数功能示例
2019/09/06 Python
浅谈python输出列表元素的所有排列形式
2020/02/26 Python
Python Scrapy多页数据爬取实现过程解析
2020/06/12 Python
解决CSS3的opacity属性带来的层叠顺序问题
2016/05/09 HTML / CSS
实例教程 HTML5 Canvas 超炫酷烟花绽放动画实现代码
2014/11/05 HTML / CSS
旷课检讨书2000字
2014/01/14 职场文书
九月份红领巾广播稿
2014/01/22 职场文书
土建工程师岗位职责
2014/06/10 职场文书
2014年秋季开学寄语
2014/08/02 职场文书
我的大学四年规划书范文2014
2014/09/26 职场文书
学校会议通知范文
2015/04/15 职场文书
检讨书怎么写?
2019/06/21 职场文书
浅谈Python魔法方法
2021/06/28 Java/Android