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 相关文章推荐
用PHP读取IMAP邮件
Oct 09 PHP
ASP和PHP都是可以删除自身的
Apr 09 PHP
php抓取https的内容的代码
Apr 06 PHP
比较discuz和ecshop的截取字符串函数php版
Sep 03 PHP
php获取汉字首字母的函数
Nov 07 PHP
PHP生成图片验证码、点击切换实例
Jun 25 PHP
Joomla使用Apache重写模式的方法
May 04 PHP
使用PHPMailer发送邮件实例
Feb 15 PHP
PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析
May 29 PHP
php处理多图上传压缩代码功能
Jun 13 PHP
PHP中“=&gt;
Mar 01 PHP
PHP获取php,mysql,apche的版本信息及更多服务器信息
Mar 09 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
浅析echo(),print(),print_r(),return之间的区别
2013/11/27 PHP
ThinkPHP关于session的操作方法汇总
2014/07/18 PHP
php数组添加元素方法小结
2014/12/20 PHP
php读取远程gzip压缩网页的方法
2014/12/29 PHP
php导出生成word的方法
2015/12/25 PHP
微信红包随机生成算法php版
2016/07/21 PHP
PHP实现断点续传乱序合并文件的方法
2018/09/06 PHP
jQuery 性能优化手册 推荐
2010/02/23 Javascript
event.X和event.clientX的区别分析
2011/10/06 Javascript
深入理解javascript中defer的作用
2013/12/11 Javascript
JavaScript实现三阶幻方算法谜题解答
2014/12/29 Javascript
DOM基础教程之事件类型
2015/01/20 Javascript
深入浅析NodeJs并发异步的回调处理
2015/12/21 NodeJs
Javascript字符串拼接小技巧(推荐)
2016/06/02 Javascript
详解微信小程序——自定义圆形进度条
2016/12/29 Javascript
echarts3 使用总结(绘制各种图表,地图)
2017/01/05 Javascript
Three.js基础学习之场景对象
2017/09/27 Javascript
JS使用栈判断给定字符串是否是回文算法示例
2019/03/04 Javascript
浅谈ECMAScript 中的Array类型
2019/06/10 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
2020/04/10 Javascript
[28:48]《真视界》- 2017年国际邀请赛
2017/09/27 DOTA
浅析Python中signal包的使用
2015/11/13 Python
老生常谈Python之装饰器、迭代器和生成器
2017/07/26 Python
Python常见字典内建函数用法示例
2018/05/14 Python
python同时遍历数组的索引和值的实例
2018/11/15 Python
Python JSON常用编解码方法代码实例
2020/09/05 Python
Canvas globalCompositeOperation
2018/12/18 HTML / CSS
关于iframe跨域使用postMessage的实现
2019/10/29 HTML / CSS
美国蔬菜和植物种子公司:Burpee
2017/02/01 全球购物
幼儿师范毕业生自荐信
2013/11/09 职场文书
大学学风建设方案
2014/05/04 职场文书
2014最新离职证明范本
2014/09/12 职场文书
团员自我评价范文
2015/03/10 职场文书
党章党规党纪学习心得体会
2016/01/14 职场文书
心得体会格式及范文
2016/01/25 职场文书
SQLServer权限之只开启创建表权限
2022/04/12 SQL Server