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 相关文章推荐
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
Mar 19 PHP
php gzip压缩输出的实现方法
Apr 27 PHP
对PHP语言认识上需要避免的10大误区
Jun 12 PHP
php计算两个文件相对路径的方法
Mar 14 PHP
php轻量级的性能分析工具xhprof的安装使用
Aug 12 PHP
PHP中模拟链表和链表的基本操作示例
Feb 27 PHP
PHP数组函数array_multisort()用法实例分析
Apr 02 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
May 20 PHP
简单的pgsql pdo php操作类实现代码
Aug 25 PHP
Zend Framework动作控制器用法示例
Dec 09 PHP
PHP上传文件及图片到七牛的方法
Jul 25 PHP
PHP PDOStatement::bindValue讲解
Jan 30 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
thinkPHP模型初始化实例分析
2015/12/03 PHP
通过php动态传数据到highcharts
2017/04/05 PHP
PHP实现基于回溯法求解迷宫问题的方法详解
2017/08/17 PHP
PHP的mysqli_sqlstate()函数讲解
2019/01/23 PHP
Prototype使用指南之array.js
2007/01/10 Javascript
JavaScript 无符号右移赋值操作
2009/04/17 Javascript
jQuery+CSS 实现随滚动条增减的汽水瓶中的液体效果
2011/09/26 Javascript
JQuery插件Style定制化方法的分析与比较
2012/05/03 Javascript
js中的this关键字详解
2013/09/25 Javascript
jQuery的ready方法详解
2014/11/27 Javascript
如何用javascript计算文本框还能输入多少个字符
2015/07/29 Javascript
JavaScript 对象字面量讲解
2016/06/06 Javascript
AngularJS中directive指令使用之事件绑定与指令交互用法示例
2016/11/22 Javascript
基于vue.js实现图片轮播效果
2016/12/01 Javascript
JavaScript实现简单的四则运算计算器完整实例
2017/04/28 Javascript
AngularJS使用ng-class动态增减class样式的方法示例
2017/05/18 Javascript
jQuery+CSS实现的table表格行列转置功能示例
2018/01/08 jQuery
Webpack 之 babel-loader文件预处理器详解
2018/03/23 Javascript
JointJS流程图的绘制方法
2018/12/03 Javascript
微信小程序里引入SVG矢量图标的方法
2019/09/20 Javascript
深入理解redux之compose的具体应用
2020/01/12 Javascript
vue使用canvas实现移动端手写签名
2020/09/22 Javascript
[09:33]2015国际邀请赛第四日TOP10
2015/08/08 DOTA
[42:24]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第三场 11.27
2020/12/01 DOTA
python方法生成txt标签文件的实例代码
2018/05/10 Python
使用python验证代理ip是否可用的实现方法
2018/07/25 Python
Tensorflow 卷积的梯度反向传播过程
2020/02/10 Python
Jupyter Notebook远程登录及密码设置操作
2020/04/10 Python
Python通过两个dataframe用for循环求笛卡尔积
2020/04/29 Python
virtualenv介绍及简明教程
2020/06/23 Python
Python字符串三种格式化输出
2020/09/17 Python
日本必酷网络直营店:Biccamera
2019/03/23 全球购物
下列程序在32位linux或unix中的结果是什么
2014/03/25 面试题
2016春季校长开学典礼致辞
2015/11/26 职场文书
如何书写你的职业生涯规划书?
2019/06/27 职场文书
导游词之湖北梁子湖
2019/11/07 职场文书