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
php项目打包方法
Feb 18 PHP
PHP 第二节 数据类型之数值型
Apr 28 PHP
apache php模块整合操作指南
Nov 16 PHP
浅析php原型模式
Nov 25 PHP
PHP使用get_headers函数判断远程文件是否存在的方法
Nov 28 PHP
php调用mysql存储过程实例分析
Dec 29 PHP
php中mysql操作buffer用法详解
Mar 19 PHP
PHP使用mkdir创建多级目录的方法
Dec 22 PHP
thinkPHP简单遍历数组方法分析
May 16 PHP
PHP Redis扩展无法加载的问题解决方法
Aug 22 PHP
ThinkPHP5框架中使用JWT的方法示例
Jun 03 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 数组的创建、调用和更新实现代码
2009/03/09 PHP
Wordpress 相册插件 NextGEN-Gallery 添加目录将中文转为拼音的解决办法
2010/12/29 PHP
php class中self,parent,this的区别以及实例介绍
2013/04/24 PHP
JavaScript实现删除电脑的关机键
2016/07/26 PHP
在模板页面的js使用办法
2010/04/01 Javascript
A标签中通过href和onclick传递的this对象实现思路
2013/04/19 Javascript
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
2014/12/12 Javascript
JavaScript 学习笔记之数据类型
2015/01/14 Javascript
SuperSlide标签切换、焦点图多种组合插件
2015/03/14 Javascript
JS+DIV实现鼠标划过切换层效果的方法
2015/05/25 Javascript
jQuery获取页面元素绝对与相对位置的方法
2015/06/10 Javascript
每天一篇javascript学习小结(Function对象)
2015/11/16 Javascript
jQuery中ajax的load()与post()方法实例详解
2016/01/05 Javascript
js实现一个简单的数字时钟效果
2017/03/29 Javascript
基于JavaScript实现验证码功能
2017/04/01 Javascript
详解Nodejs之静态资源处理
2017/06/05 NodeJs
jQuery实现下拉菜单的实例代码
2017/06/19 jQuery
基于 Bootstrap Datetimepicker 联动
2017/08/03 Javascript
微信小程序promsie.all和promise顺序执行
2017/10/27 Javascript
详解Vue 全局引入bass.scss 处理方案
2018/03/26 Javascript
简述pm2常用命令集合及配置文件说明
2019/05/30 Javascript
el-form 多层级表单的实现示例
2020/09/10 Javascript
用Python和MD5实现网站挂马检测程序
2014/03/13 Python
python按时间排序目录下的文件实现方法
2018/10/17 Python
django实现模型字段动态choice的操作
2020/04/01 Python
jupyter notebook实现显示行号
2020/04/13 Python
为什么说python适合写爬虫
2020/06/11 Python
英国最大的邮寄种子和植物公司:Thompson & Morgan
2017/09/21 全球购物
医学生实习自我鉴定
2013/09/27 职场文书
保送生自荐信范文
2013/10/06 职场文书
马云的职业生涯规划之路
2014/01/01 职场文书
酒店七夕情人节活动策划方案
2014/08/24 职场文书
生日宴会祝酒词
2015/08/10 职场文书
2017公司年会主持人开幕词
2016/03/04 职场文书
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
2021/04/06 Python
SpringBoot快速入门详解
2021/07/21 Java/Android