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 相关文章推荐
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
Oct 09 PHP
PHP 引用是个坏习惯
Mar 12 PHP
php实现rc4加密算法代码
Apr 25 PHP
探讨如何把session存入数据库
Jun 07 PHP
php 邮件发送问题解决
Mar 22 PHP
thinkphp文件引用与分支结构用法实例
Nov 26 PHP
WordPress中用于获取文章信息以及分类链接的函数用法
Dec 18 PHP
PHP7+Nginx的配置与安装教程详解
May 10 PHP
php下载文件超时时间的设置方法
Oct 06 PHP
PHP中功能强大却很少使用的函数实例小结
Nov 10 PHP
PHP简单实现欧拉函数Euler功能示例
Nov 06 PHP
php微信公众号开发之翻页查询
Oct 20 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安装攻略:常见问题解答(三)
2006/10/09 PHP
php下用GD生成生成缩略图的两个选择和区别
2007/04/17 PHP
php simplexmlElement操作xml的命名空间实现代码
2011/01/04 PHP
php实现的返回数据格式化类实例
2014/09/22 PHP
PHP中散列密码的安全性分析
2019/07/26 PHP
php获取小程序码的实现代码(B类接口)
2020/06/13 PHP
JavaScript 参考教程
2006/12/29 Javascript
JQuery 学习笔记 选择器之三
2009/07/23 Javascript
jquery制作弹窗提示窗口代码分享
2014/03/02 Javascript
jQuery中;function($,undefined) 前面的分号的用处
2014/12/17 Javascript
如何使用jquery easyui创建标签组件
2015/11/18 Javascript
浏览器兼容性问题大汇总
2015/12/17 Javascript
jquery操作select元素和option的实例代码
2016/02/03 Javascript
jQuery实现获取table表格第一列值的方法
2016/03/01 Javascript
javascript实现平滑无缝滚动
2020/08/09 Javascript
js实现精确到毫秒的倒计时效果
2016/08/05 Javascript
js实现产品缩略图效果
2017/03/10 Javascript
js原生map实现的方法总结
2020/01/19 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
three.js 利用uv和ThreeBSP制作一个快递柜功能
2020/08/18 Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
2021/01/22 Vue.js
python实现数独算法实例
2015/06/09 Python
Python使用tablib生成excel文件的简单实现方法
2016/03/16 Python
Python正则抓取新闻标题和链接的方法示例
2017/04/24 Python
python正则表达式的使用
2017/06/12 Python
python组合无重复三位数的实例
2018/11/13 Python
Django中更改默认数据库为mysql的方法示例
2018/12/05 Python
对pytorch中的梯度更新方法详解
2019/08/20 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
2020/09/26 Python
英国女士家居服网站:hush
2017/08/09 全球购物
2014年大班元旦活动方案
2014/02/26 职场文书
新年团拜会主持词
2014/04/02 职场文书
学期个人工作总结
2015/02/13 职场文书
贪污检举信范文
2015/03/02 职场文书
让文件路径提取变得更简单的Python Path库
2021/05/27 Python
OpenCV图像变换之傅里叶变换的一些应用
2021/07/26 Python