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学习之运算符相关概念
Jun 09 PHP
php中通过虚代理实现延迟加载的实现代码
Jun 10 PHP
ThinkPHP CURD方法之order方法详解
Jun 18 PHP
php中base64_decode与base64_encode加密解密函数实例
Nov 24 PHP
php发送邮件的问题详解
Jun 22 PHP
微信公众号OAuth2.0网页授权问题浅析
Jan 21 PHP
PHP实现批量删除(封装)
Apr 28 PHP
详解PHP防止直接访问.php 文件的实现方法
Jul 28 PHP
PHP钩子与简单分发方式实例分析
Sep 04 PHP
thinkPHP框架中执行原生SQL语句的方法
Oct 25 PHP
php7 新增功能实例总结
May 25 PHP
imagettftext() 失效,不起作用
Mar 09 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
使用 eAccelerator加速PHP代码的方法
2007/09/30 PHP
PHP创建桌面快捷方式的实例代码
2014/02/17 PHP
php实现解析xml并生成sql语句的方法
2018/02/03 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
js二级地域选择的实现方法
2013/06/17 Javascript
禁止空格提交表单的js代码
2013/11/17 Javascript
全面解析Bootstrap表单使用方法(表单控件)
2015/11/24 Javascript
DeviceOne 让你一见钟情的App快速开发平台
2016/02/17 Javascript
iScroll.js 使用方法参考
2016/05/16 Javascript
JavaScript实现汉字转换为拼音的库文件示例
2016/12/22 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
jQuery弹出窗口简单实现代码
2017/03/09 Javascript
jQuery+pjax简单示例汇总
2017/04/21 jQuery
vue实现通讯录功能
2018/07/14 Javascript
vue自定义指令实现仅支持输入数字和浮点型的示例
2019/10/30 Javascript
VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析
2019/12/02 Javascript
Python和php通信乱码问题解决方法
2014/04/15 Python
python对指定目录下文件进行批量重命名的方法
2015/04/18 Python
python使用win32com库播放mp3文件的方法
2015/05/30 Python
Python脚本实现自动发带图的微博
2016/04/27 Python
详解Python3.6的py文件打包生成exe
2018/07/13 Python
python发送告警邮件脚本
2018/09/17 Python
Python3的介绍、安装和命令行的认识(推荐)
2018/10/20 Python
对django xadmin自定义菜单的实例详解
2019/01/03 Python
Python File(文件) 方法整理
2019/02/18 Python
Python3 max()函数基础用法
2019/02/19 Python
浅谈keras.callbacks设置模型保存策略
2020/06/18 Python
马歇尔耳机官网:Marshall Headphones
2020/02/04 全球购物
应届毕业生求职信范文
2013/12/18 职场文书
公务员转正考察材料
2014/02/07 职场文书
2014年十一国庆向国旗敬礼寄语
2014/04/11 职场文书
幼儿园六一活动总结
2014/08/27 职场文书
2015年学生管理工作总结
2015/05/26 职场文书
美丽的大脚观后感
2015/06/03 职场文书
用JS实现飞机大战小游戏
2021/06/09 Javascript