php关于array_multisort多维数组排序的使用说明


Posted in PHP onJanuary 04, 2011

一、先看最简单的情况。有两个数组:

$arr1 = array(1,9,5); 
$arr2 = array(6,2,4); 
array_multisort($arr1,$arr2); 
print_r($arr1); // 得到的顺序是1,5,9 
print_r($arr2); // 得到的顺序是6,4,2

我估计两个数组的值自始至终都是对应着的:1对应6,9对应2,5对应4。
我们再加多一个数组看看会怎样:
$arr1 = array(1,9,5); 
$arr2 = array(6,2,4); 
$arr3 = array(3,7,8); 
array_multisort($arr1,$arr2,$arr3);

查看结果,1自始至终都对应6对应3,其它项也是如此。这种对应关系就是手册中所谓的“排序时保留原有的键名关联”。
另外也可以把每个数组想像成数据库表的一列。而对应着的1,6,3为一数据行,9,2,7为另一数据行。。。
array_multisort会先按第一个数组(想像成列)排序,如果第一个数组(列)的值相同,则按第二个数组(列)排序。
具体可以用下面的程式来测试:
$arr1 = array(1,9,5,9); 
$arr2 = array(6,2,4,1); 
$arr3 = array(3,7,8,0); 
array_multisort($arr1,$arr2,$arr3);

可以想像这里$arr3的结果是(3,8,0,7)。
二、接下来讲解array_multisort的参数。这个函数的参数很灵活。最简单的情况是如上面所示的以1个或n个数组作为参数,需要注意的是每个数组的项数要一样,否则会warning导致排序失效。
像这样array_multisort($arr1,$arr2,$arr3); 默认是所有数组都是升序排列,如果想对$arr2降序,并当作字符串去比较,就要写成:
array_multisort($arr1, $arr2, SORT_DESC, SORT_STRING, $arr3);
每个array后面可以跟一个排序顺序标志或一个排序类型标志,或者两种标志同时出现。但是每种排序标志在每个数组后面只能出现一个。
详细如下:
排序顺序标志:

SORT_ASC - 按照上升顺序排序(默认)
SORT_DESC - 按照下降顺序排序

排序类型标志:

SORT_REGULAR - 将项目按照通常方法比较(默认)
SORT_NUMERIC - 将项目按照数值比较
SORT_STRING - 将项目按照字符串比较

三、最后是array_multisort有什么实际作用。
我们通常有一些多维数组需要排序:
$guys = Array
(
[0] => Array
(
[name] => jake
[score] => 80
[grade] => A
)
[1] => Array
(
[name] => jin
[score] => 70
[grade] => A
)
[2] => Array
(
[name] => john
[score] => 80
[grade] => A
)
[3] => Array
(
[name] => ben
[score] => 20
[grade] => B
)
)
例如我们想按成绩倒序排列,如果成绩相同就按名字的升序排列。这时我们就需要根据$guys的顺序多弄两个数组出来:$scores = array(80,70,80,20);$names = array('jake','jin','john','ben');然后array_multisort($scores, SORT_DESC, $names, $guys);就行了还能不能更灵活一点呢,每次想排序都要另外弄些数组出来吗?其实在qeephp的helper_array类里面已经封装得很好,下面是它的两个方法,需要的人自己修改一下就可以用了:

/** 
* 根据指定的键对数组排序 
* 
* 用法: 
* @code php 
* $rows = array( 
* array('id' => 1, 'value' => '1-1', 'parent' => 1), 
* array('id' => 2, 'value' => '2-1', 'parent' => 1), 
* array('id' => 3, 'value' => '3-1', 'parent' => 1), 
* array('id' => 4, 'value' => '4-1', 'parent' => 2), 
* array('id' => 5, 'value' => '5-1', 'parent' => 2), 
* array('id' => 6, 'value' => '6-1', 'parent' => 3), 
* ); 
* 
* $rows = Helper_Array::sortByCol($rows, 'id', SORT_DESC); 
* dump($rows); 
* // 输出结果为: 
* // array( 
* // array('id' => 6, 'value' => '6-1', 'parent' => 3), 
* // array('id' => 5, 'value' => '5-1', 'parent' => 2), 
* // array('id' => 4, 'value' => '4-1', 'parent' => 2), 
* // array('id' => 3, 'value' => '3-1', 'parent' => 1), 
* // array('id' => 2, 'value' => '2-1', 'parent' => 1), 
* // array('id' => 1, 'value' => '1-1', 'parent' => 1), 
* // ) 
* @endcode 
* 
* @param array $array 要排序的数组 
* @param string $keyname 排序的键 
* @param int $dir 排序方向 
* 
* @return array 排序后的数组 
*/ 
static function sortByCol($array, $keyname, $dir = SORT_ASC) 
{ 
return self::sortByMultiCols($array, array($keyname => $dir)); 
} /** 
* 将一个二维数组按照多个列进行排序,类似 SQL 语句中的 ORDER BY 
* 
* 用法: 
* @code php 
* $rows = Helper_Array::sortByMultiCols($rows, array( 
* 'parent' => SORT_ASC, 
* 'name' => SORT_DESC, 
* )); 
* @endcode 
* 
* @param array $rowset 要排序的数组 
* @param array $args 排序的键 
* 
* @return array 排序后的数组 
*/ 
static function sortByMultiCols($rowset, $args) 
{ 
$sortArray = array(); 
$sortRule = ''; 
foreach ($args as $sortField => $sortDir) 
{ 
foreach ($rowset as $offset => $row) 
{ 
$sortArray[$sortField][$offset] = $row[$sortField]; 
} 
$sortRule .= '$sortArray[\'' . $sortField . '\'], ' . $sortDir . ', '; 
} 
if (empty($sortArray) || empty($sortRule)) { return $rowset; } 
eval('array_multisort(' . $sortRule . '$rowset);'); 
return $rowset; 
}

PHP 相关文章推荐
新版mysql+apache+php Linux安装指南
Oct 09 PHP
php数组函数序列之rsort() - 对数组的元素值进行降序排序
Nov 02 PHP
PHP使用array_multisort对多个数组或多维数组进行排序
Dec 16 PHP
smarty内置函数capture用法分析
Jan 22 PHP
PHP CURL 多线程操作代码实例
May 13 PHP
PHP实现全角字符转为半角方法汇总
Jul 09 PHP
thinkPHP中create方法与令牌验证实例浅析
Dec 08 PHP
php版微信公众平台开发之验证步骤实例详解
Sep 23 PHP
PHP关键特性之命名空间实例详解
May 06 PHP
php生成条形码的图片的实例详解
Sep 13 PHP
PHP levenshtein()函数用法讲解
Mar 08 PHP
PHP数组array类常见操作示例
May 15 PHP
PHP 设置MySQL连接字符集的方法
Jan 02 #PHP
php array_unique之后json_encode需要注意
Jan 02 #PHP
从php核心代码分析require和include的区别
Jan 02 #PHP
深入理解PHP之require/include顺序 推荐
Jan 02 #PHP
PHP中foreach循环中使用引用要注意的地方
Jan 02 #PHP
PHP开发中四种查询返回结果分析
Jan 02 #PHP
linux下删除7天前日志的代码(php+shell)
Jan 02 #PHP
You might like
php Ajax乱码
2008/04/09 PHP
PHP CURL获取返回值的方法
2014/05/04 PHP
php+xml编程之xpath的应用实例
2015/01/24 PHP
Yii2.0中的COOKIE和SESSION用法
2016/08/12 PHP
DOM下的节点属性和操作小结
2009/05/14 Javascript
Event altKey,ctrlKey,shiftKey属性解析
2013/12/18 Javascript
js函数参数设置默认值的一种变通实现方法
2014/05/26 Javascript
jQuery实现将页面上HTML标签换成另外标签的方法
2015/06/09 Javascript
js中实现字符串和数组的相互转化详解
2016/01/24 Javascript
js+canvas简单绘制圆圈的方法
2016/01/28 Javascript
Angular的$http与$location
2016/12/26 Javascript
漂亮实用的页面loading(加载)封装代码
2017/02/03 Javascript
在Mac下彻底卸载node和npm的方法
2018/05/16 Javascript
详解vue-router 命名路由和命名视图
2018/06/01 Javascript
vuejs 动态添加input框的实例讲解
2018/08/24 Javascript
详解react阻止无效重渲染的多种方式
2018/12/11 Javascript
React中this丢失的四种解决方法
2019/03/12 Javascript
python根据经纬度计算距离示例
2014/02/16 Python
Python 高级专用类方法的实例详解
2017/09/11 Python
Python实现合并两个列表的方法分析
2018/05/28 Python
python文本数据处理学习笔记详解
2019/06/17 Python
Django REST Framework序列化外键获取外键的值方法
2019/07/26 Python
Python基于内置库pytesseract实现图片验证码识别功能
2020/02/24 Python
什么是python的列表推导式
2020/05/26 Python
Python正则re模块使用步骤及原理解析
2020/08/18 Python
解决python 执行shell命令无法获取返回值的问题
2020/12/05 Python
python上下文管理器异常问题解决方法
2021/02/07 Python
大学生期末自我鉴定
2014/02/01 职场文书
创建绿色学校先进个人材料
2014/08/20 职场文书
2014年采购部工作总结
2014/11/20 职场文书
行政助理岗位职责
2015/02/10 职场文书
医学生自荐信范文
2015/03/05 职场文书
培训班通知
2015/04/25 职场文书
考勤制度通知
2015/04/25 职场文书
2015年图书馆个人工作总结
2015/05/26 职场文书
Python自动操作神器PyAutoGUI的使用教程
2022/06/16 Python