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制作新闻系统的思路
Oct 09 PHP
在mysql数据库原有字段后增加新内容
Nov 26 PHP
php 高效率写法 推荐
Feb 21 PHP
比较详细PHP生成静态页面教程
Jan 10 PHP
php 网上商城促销设计实例代码
Feb 17 PHP
PHP中使用mktime获取时间戳的一个黑色幽默分析
May 31 PHP
smarty基础之拼接字符串的详解
Jun 18 PHP
php 启动报错如何解决
Jan 17 PHP
深入理解PHP中的count函数
May 31 PHP
PHP自定义函数获取汉字首字母的方法
Dec 01 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
Jun 14 PHP
PHP实现本地图片转base64格式并上传
May 29 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
德劲1103的维修打理经验
2021/03/02 无线电
php一些公用函数的集合
2008/03/27 PHP
PHP的MVC模式实现原理分析(一相简单的MVC框架范例)
2014/04/29 PHP
CMS中PHP判断系统是否已经安装的方法示例
2014/07/26 PHP
PHP基于文件存储实现缓存的方法
2015/07/20 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
PHP中$GLOBALS与global的区别详解
2019/03/21 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
2019/05/08 PHP
PHP的imageTtfText()函数深入详解
2021/03/03 PHP
js ondocumentready onmouseover onclick onmouseout 样式
2010/07/22 Javascript
js如何取消事件冒泡
2013/09/23 Javascript
javascript基本语法
2016/05/31 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
2016/09/01 Javascript
前端编码规范(3)JavaScript 开发规范
2017/01/21 Javascript
微信小程序中的swiper组件详解
2017/04/14 Javascript
promise和co搭配生成器函数方式解决js代码异步流程的比较
2018/05/25 Javascript
Bootstrap table表格初始化表格数据的方法
2018/07/25 Javascript
vue中利用Promise封装jsonp并调取数据
2019/06/18 Javascript
微信小程序实现发微博功能的示例代码
2020/06/24 Javascript
JavaScript 防抖和节流遇见的奇怪问题及解决
2020/11/20 Javascript
Python易忽视知识点小结
2015/05/25 Python
学习python之编写简单乘法口诀表实现代码
2016/02/27 Python
Python 'takes exactly 1 argument (2 given)' Python error
2016/12/13 Python
python简单实例训练(21~30)
2017/11/15 Python
TensorFlow搭建神经网络最佳实践
2018/03/09 Python
对Python3.x版本print函数左右对齐详解
2018/12/22 Python
python selenium firefox使用详解
2019/02/26 Python
使用pytorch完成kaggle猫狗图像识别方式
2020/01/10 Python
django执行数据库查询之后实现返回的结果集转json
2020/03/31 Python
iKRIX意大利网上商店:男女豪华服装和配件
2019/10/09 全球购物
社区安全检查制度
2014/02/03 职场文书
关于孝道的演讲稿
2014/05/21 职场文书
公务员培的训心得体会
2014/09/01 职场文书
2015年爱牙日活动总结
2015/03/23 职场文书
MySQL不使用order by实现排名的三种思路总结
2021/06/02 MySQL
使用refresh_token实现无感刷新页面
2022/04/26 Javascript