php二维数组排序详解


Posted in PHP onNovember 06, 2013

有时候为了达到一定目的,需要对二维数组进行排序,现分享一下其实现的方法。

$arr=array (
'1' => array ( 'date' => '2011-08-18', 'num' => 5 ) ,
'2' => array ( 'date' => '2011-08-20', 'num' => 3 ) ,
'3' => array ( 'date' => '2011-08-17', 'num' => 10 )
 )  ; $result = sysSortArray($arr,'num');这样运行之后的效果为:
$arr=array (
'1' => array ( 'date' => '2011-08-18', 'num' => 3 ) ,
'2' => array ( 'date' => '2011-08-20', 'num' => 5 ) ,
'3' => array ( 'date' => '2011-08-17', 'num' => 10 )
 )  ;用到的函数:
/**
 * Sort an two-dimension array by some level two items use array_multisort() function.
 *
 * sysSortArray($Array,"Key1","SORT_ASC","SORT_RETULAR","Key2";……)
 * @author                      lamp100
 * @param  array   $ArrayData   the array to sort.
 * @param  string  $KeyName1    the first item to sort by.
 * @param  string  $SortOrder1  the order to sort by("SORT_ASC"|"SORT_DESC")
 * @param  string  $SortType1   the sort type("SORT_REGULAR"|"SORT_NUMERIC"|"SORT_STRING")
 * @return array                sorted array.
 */
function sysSortArray($ArrayData,$KeyName1,$SortOrder1 = "SORT_ASC",$SortType1 = "SORT_REGULAR")
{
    if(!is_array($ArrayData))
    {
        return $ArrayData;
    }
    // Get args number.
    $ArgCount = func_num_args();
    // Get keys to sort by and put them to SortRule array.
    for($I = 1;$I < $ArgCount;$I ++)
    {
        $Arg = func_get_arg($I);
        if(!eregi("SORT",$Arg))
        {
            $KeyNameList[] = $Arg;
            $SortRule[]    = '$'.$Arg;
        }
        else
        {
            $SortRule[]    = $Arg;
        }
    }
    // Get the values according to the keys and put them to array.
    foreach($ArrayData AS $Key => $Info)
    {
        foreach($KeyNameList AS $KeyName)
        {
            ${$KeyName}[$Key] = $Info[$KeyName];
        }
    }
    // Create the eval string and eval it.
    $EvalString = 'array_multisort('.join(",",$SortRule).',$ArrayData);';
    eval ($EvalString);
    return $ArrayData;
}

另外:array_multisort 函数功能也很强大,详细可以参看PHP手册,里面讲的很详细。

我们可以使用array_multisort()这个函数。array_multisort() 函数对多个数组或多维数组进行排序。
参数中的数组被当成一个表的列并以行来进行排序 - 这类似 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话,就会按照下一个输入数组中相应值的大小进行排序,依此类推。
第一个参数是数组,随后的每一个参数可能是数组,也可能是下面的排序顺序标志(排序标志用于更改默认的排列顺序)之一:
•SORT_ASC - 默认,按升序排列。(A-Z)
•SORT_DESC - 按降序排列。(Z-A)
随后可以指定排序的类型:
•SORT_REGULAR - 默认。将每一项按常规顺序排列。
•SORT_NUMERIC - 将每一项按数字顺序排列。
•SORT_STRING - 将每一项按字母顺序排列。
语法:array_multisort(array1,sorting order,sorting type,array2,array3...)
•array1:必需。规定输入的数组。
•sorting order:可选。规定排列顺序。可能的值是 SORT_ASC 和 SORT_DESC。
•sorting type:可选。规定排序类型。可能的值是SORT_REGULAR、SORT_NUMERIC和SORT_STRING。
•array2:可选。规定输入的数组。
•array3:可选。规定输入的数组。
字符串键名将被保留,但是数字键将被重新索引,从 0 开始,并以 1 递增。可以在每个数组后设置排序顺序和排序类型。如果没有设置,每个数组参数会使用默认值。
下面是一个例子:

<?php $arr = '';
 echo '二维数组如下:'.'<br / >';
 for($i=0; $i<=5; $i++)
 {
  $arr[$i]['val'] = mt_rand(1, 100);
  $arr[$i]['num'] = mt_rand(1, 100);
 }
 echo '<pre>';
 print_r($arr);
 echo '</pre>';
 echo '从二维数组中抽出键为val,单独成另一个数组:'.'<br / >';
 foreach ($arr as $key => $row) 
 {
     $vals[$key] = $row['val'];
        $nums[$key] = $row['num'];
 }
 echo '<pre>';
 print_r($vals);
 echo '</pre>';
 echo '对其进行排序:'.'<br / >';
 array_multisort($vals, SORT_ASC, $arr);
 echo '<pre>';
 print_r($vals);
 echo '</pre>';
?>
 

运行结果:
二维数组如下:
Array
(
    [0] => Array
        (
            [val] => 46
            [num] => 49
        )
    [1] => Array
        (
            [val] => 8
            [num] => 24
        )
    [2] => Array
        (
            [val] => 37
            [num] => 3
        )
    [3] => Array
        (
            [val] => 32
            [num] => 35
        )
    [4] => Array
        (
            [val] => 19
            [num] => 38
        )
    [5] => Array
        (
            [val] => 30
            [num] => 37
        )
)
从二维数组中抽出键为val,单独成另一个数组:
Array
(
    [0] => 46
    [1] => 8
    [2] => 37
    [3] => 32
    [4] => 19
    [5] => 30
)
对其进行排序:
Array
(
    [0] => 8
    [1] => 19
    [2] => 30
    [3] => 32
    [4] => 37
    [5] => 46
)
我们将得到一个按val升序排序的二维数组。
PHP 相关文章推荐
PHP Mysql编程之高级技巧
Aug 27 PHP
PHP操作数组相关函数
Feb 03 PHP
php代码运行时间查看类代码分享
Aug 06 PHP
Window 7/XP 安装Apache 2.4与PHP 5.4 的过程详解
Jun 02 PHP
如何用php生成扭曲及旋转的验证码图片
Jun 07 PHP
PHP内核探索:变量存储与类型使用说明
Jan 30 PHP
thinkphp实现like模糊查询实例
Oct 29 PHP
PHP概率计算函数汇总
Sep 13 PHP
php简单实现单态设计模式的方法分析
Jul 28 PHP
详解提高使用Java反射的效率方法
Apr 29 PHP
php适配器模式简单应用示例
Oct 23 PHP
PHP cookie与session会话基本用法实例分析
Nov 18 PHP
PHP Curl多线程原理实例详解
Nov 06 #PHP
php二维数组用键名分组相加实例函数
Nov 06 #PHP
php不用正则验证真假身份证
Nov 06 #PHP
php 中文字符串首字母的获取函数分享
Nov 04 #PHP
PHP图片上传代码
Nov 04 #PHP
PHP CURL获取cookies模拟登录的方法
Nov 04 #PHP
php Session存储到Redis的方法
Nov 04 #PHP
You might like
风格模板初级不完全修改教程
2006/10/09 PHP
php foreach 参数强制类型转换的问题
2010/12/10 PHP
有关PHP性能优化的介绍
2013/06/20 PHP
用 Composer构建自己的 PHP 框架之基础准备
2014/10/30 PHP
PHP单例模式应用示例【多次连接数据库只实例化一次】
2018/12/18 PHP
JavaScript实现x秒后自动跳转到一个页面
2013/01/03 Javascript
jQuery获取浏览器中的分辨率实现代码
2013/04/23 Javascript
JS读取XML文件示例代码
2013/11/15 Javascript
Javascript基础教程之break和continue语句
2015/01/18 Javascript
Javascript基础_简单比较undefined和null 值
2016/06/14 Javascript
Vue开发过程中遇到的疑惑知识点总结
2017/01/20 Javascript
Bootstrap popover 实现鼠标移入移除显示隐藏功能方法
2018/01/24 Javascript
vue移动UI框架滑动加载数据的方法
2018/03/12 Javascript
vue.js实现带日期星期的数字时钟功能示例
2018/08/28 Javascript
在vue-cli的组件模板里使用font-awesome的两种方法
2018/09/28 Javascript
浅析Vue.js中v-bind v-model的使用和区别
2018/12/04 Javascript
实现elementUI表单的全局验证的方法步骤
2019/04/29 Javascript
angular多语言配置详解
2019/05/16 Javascript
原生javascript自定义input[type=radio]效果示例
2019/08/27 Javascript
使用flow来规范javascript的变量类型
2019/09/12 Javascript
微信小程序3D轮播实现代码
2019/09/19 Javascript
详解JS函数防抖
2020/06/05 Javascript
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
[03:40]DOTA2抗疫特别篇《英雄年代》
2020/02/28 DOTA
用Python实现换行符转换的脚本的教程
2015/04/16 Python
python实现自动重启本程序的方法
2015/07/09 Python
python使用str &amp; repr转换字符串
2016/10/13 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
2018/07/25 Python
Python3将jpg转为pdf文件的方法示例
2019/12/13 Python
职工代表大会主持词
2014/04/01 职场文书
资产运营委托书范本
2014/10/16 职场文书
2014年社区个人工作总结
2014/12/02 职场文书
golang interface判断为空nil的实现代码
2021/04/24 Golang
Python爬虫框架之Scrapy中Spider的用法
2021/06/28 Python
Mysql案例刨析事务隔离级别
2021/09/25 MySQL
bootstrapv4轮播图去除两侧阴影及线框的方法
2022/02/15 HTML / CSS