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 相关文章推荐
建立文件交换功能的脚本(二)
Oct 09 PHP
如何实现给定日期的若干天以后的日期
Oct 09 PHP
PHP 中文乱码解决办法总结分析
Jul 30 PHP
PHP以及MYSQL日期比较方法
Nov 29 PHP
PHP在线生成二维码代码(google api)
Jun 03 PHP
分享一个php 的异常处理程序
Jun 22 PHP
PHP使用feof()函数读文件的方法
Nov 07 PHP
修改WordPress中文章编辑器的样式的方法详解
Dec 15 PHP
PHP记录页面停留时间的方法
Mar 30 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
Feb 10 PHP
PHP长连接实现与使用方法详解
Feb 11 PHP
PHP实现登录验证码校验功能
May 17 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
Yii CGridView用法实例详解
2016/07/12 PHP
PHP实现简单的计算器
2020/08/28 PHP
php gethostbyname获取域名ip地址函数详解
2010/01/24 Javascript
document.createElement()用法
2013/03/13 Javascript
jquery ajax方式直接提交整个表单核心代码
2013/08/15 Javascript
关于jquery中全局函数each使用介绍
2013/12/10 Javascript
Javascript学习笔记之数组的构造函数
2014/11/23 Javascript
JavaScript中的setMilliseconds()方法使用详解
2015/06/11 Javascript
jquery使用ul模拟select实现表单美化的方法
2015/08/18 Javascript
jquery采用oop模式class类的使用示例
2016/01/22 Javascript
JS实现页面跳转参数不丢失的方法
2016/11/28 Javascript
vue组件之间数据传递的方法实例分析
2019/02/12 Javascript
详解vue配置后台接口方式
2019/03/29 Javascript
js实现数字滚动特效
2019/12/16 Javascript
html-webpack-plugin修改页面的title的方法
2020/06/18 Javascript
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
[01:41]DOTA2超级联赛专访YYF 称一辈子难忘TI2
2013/05/28 DOTA
简单谈谈python的反射机制
2016/06/28 Python
Python3.遍历某文件夹提取特定文件名的实例
2018/04/26 Python
Python实现最常见加密方式详解
2019/07/13 Python
Pandas实现dataframe和np.array的相互转换
2019/11/30 Python
详解Pytorch显存动态分配规律探索
2020/11/17 Python
HTML5 canvas基本绘图之绘制五角星
2016/06/27 HTML / CSS
HTML5新增加标签和功能概述
2016/09/05 HTML / CSS
39美元购买一副眼镜或太阳镜:39DollarGlasses.com
2018/06/17 全球购物
Notino意大利:购买香水和化妆品
2018/11/14 全球购物
荣耀俄罗斯官网:HONOR俄罗斯
2020/10/31 全球购物
网上常见的一份Linux面试题(多项选择部分)
2014/09/09 面试题
介绍一下Python中webbrowser的用法
2013/05/07 面试题
Java面试笔试题大全
2016/11/23 面试题
护士个人简历自荐信
2013/10/18 职场文书
企业元宵节主持词
2014/03/25 职场文书
作风转变年心得体会
2014/10/22 职场文书
2015年国庆节活动总结
2015/03/23 职场文书
初中数学课堂教学反思
2016/02/17 职场文书
PHP正则表达式之RCEService回溯
2022/04/11 PHP