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下将多个数组合并成一个数组的方法与实例代码
Feb 03 PHP
php中邮箱地址正则表达式实现与详解
Apr 24 PHP
强制PHP命令行脚本单进程运行的方法
Apr 15 PHP
php过滤HTML标签、属性等正则表达式汇总
Sep 22 PHP
php相对当前文件include其它文件的方法
Mar 13 PHP
php获取发送给用户的header信息的方法
Mar 16 PHP
PHP数组与对象之间使用递归实现转换的方法
Jun 24 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
Oct 16 PHP
PHP编程入门的基本语法知识点总结
Jan 26 PHP
学习PHP的数组总结【经验】
May 05 PHP
PHP读取zip文件的方法示例
Nov 17 PHP
php封装的mongodb操作类代码
Aug 06 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
dede全站URL静态化改造[070414更正]
2007/04/17 PHP
php5 pdo新改动加载注意事项
2008/09/11 PHP
php错误提示failed to open stream: HTTP request failed!的完美解决方法
2011/06/06 PHP
解析smarty模板中类似for的功能实现
2013/06/18 PHP
php创建session的方法实例详解
2015/01/27 PHP
thinkphp5.1框架模板布局与模板继承用法分析
2019/07/19 PHP
Prototype1.6 JS 官方下载地址
2007/11/30 Javascript
JQuery UI皮肤定制
2009/07/27 Javascript
Jquery实现带动画效果的经典二级导航菜单
2013/03/22 Javascript
用JavaScript获取DOM元素位置和尺寸大小的方法
2013/04/12 Javascript
js实现从中间开始往上下展开网页窗口的方法
2015/03/02 Javascript
JS通过ajax动态读取xml文件内容的方法
2015/03/24 Javascript
jquery实现不包含当前项的选择器实例
2015/06/25 Javascript
实例解析angularjs的filter过滤器
2016/12/14 Javascript
几行js代码实现自适应
2017/02/24 Javascript
Ionic3 UI组件之Gallery Modal详解
2017/06/07 Javascript
浅谈jQuery框架Ajax常用选项
2017/07/08 jQuery
vue2.x 父组件监听子组件事件并传回信息的方法
2017/07/17 Javascript
Node.js中,在cmd界面,进入退出Node.js运行环境的方法
2018/05/12 Javascript
详解使用 Node.js 开发简单的脚手架工具
2018/06/08 Javascript
详解关于html,css,js三者的加载顺序问题
2019/04/10 Javascript
Vee-validate 父组件获取子组件表单校验结果的实例代码
2019/05/20 Javascript
详解微信小程序开发之formId使用(模板消息)
2019/08/27 Javascript
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
typescript配置alias的详细步骤
2020/08/12 Javascript
用Python编写一个简单的俄罗斯方块游戏的教程
2015/04/03 Python
Python socket网络编程TCP/IP服务器与客户端通信
2017/01/05 Python
Python利用turtle库绘制彩虹代码示例
2017/12/20 Python
python读取有密码的zip压缩文件实例
2019/02/08 Python
python文件转为exe文件的方法及用法详解
2019/07/08 Python
pytorch实现Tensor变量之间的转换
2020/02/17 Python
Linux面试题LINUX系统类
2014/11/19 面试题
关于环保的活动方案
2014/08/25 职场文书
入党积极分子半年考察意见
2015/06/02 职场文书
MATLAB 如何求取离散点的曲率最大值
2021/04/16 Python
mysql如何能有效防止删库跑路
2021/10/05 MySQL