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 相关文章推荐
网站用php实现paypal整合方法
Nov 28 PHP
深入探讨PHP中的内存管理问题
Aug 31 PHP
php中的curl_multi系列函数使用例子
Jul 29 PHP
Laravel 4 初级教程之安装及入门
Oct 30 PHP
将FCKeditor导入PHP+SMARTY的实现方法
Jan 15 PHP
php判断两个日期之间相差多少个月份的方法
Jun 18 PHP
PHP模拟asp中response类实现方法
Aug 08 PHP
通过PHP简单实例介绍文件上传
Dec 16 PHP
PHP中key和current,next的联合运用实例分析
Mar 29 PHP
PHP内置加密函数详解
Nov 20 PHP
PHP长连接实现与使用方法详解
Feb 11 PHP
php创建多级目录与级联删除文件的方法示例
Sep 12 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
探讨方法的重写(覆载)详解
2013/06/08 PHP
php实现建立多层级目录的方法
2014/07/19 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
Javascript 代码也可以变得优美的实现方法
2009/06/22 Javascript
javascript温习的一些笔记 基础常用知识小结
2011/06/22 Javascript
面向对象的Javascript之三(封装和信息隐藏)
2012/01/27 Javascript
在myeclipse中如何加入jquery代码提示功能
2014/06/03 Javascript
jquery中添加属性和删除属性
2015/06/03 Javascript
基于JavaScript获取鼠标位置的各种方法
2015/12/16 Javascript
node.js实现博客小爬虫的实例代码
2016/10/08 Javascript
canvas实现图像放大镜
2017/02/06 Javascript
AngularJS中$http的交互问题
2017/03/29 Javascript
webpack源码之loader机制详解
2018/04/06 Javascript
使用Webpack提升Vue.js应用程序的4种方法(翻译)
2019/10/09 Javascript
Python 序列化 pickle/cPickle模块使用介绍
2014/11/30 Python
Python实现七彩蟒蛇绘制实例代码
2018/01/16 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
2018/12/20 Python
Python实现针对json中某个关键字段进行排序操作示例
2018/12/25 Python
对Python中创建进程的两种方式以及进程池详解
2019/01/14 Python
Python实现的列表排序、反转操作示例
2019/03/13 Python
由面试题加深对Django的认识理解
2019/07/19 Python
pytorch使用tensorboardX进行loss可视化实例
2020/02/24 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
2020/02/24 Python
浅谈Python 函数式编程
2020/06/20 Python
Missguided美国官网:英国时尚品牌
2018/01/18 全球购物
在C中是否有模拟继承等面向对象程序设计特性的好方法
2012/05/22 面试题
十佳教师事迹材料
2014/01/11 职场文书
秘书英文求职信
2014/04/16 职场文书
2014年综治宣传月活动总结
2014/04/28 职场文书
环境科学专业教师求职信
2014/07/12 职场文书
新课培训心得体会
2014/09/03 职场文书
2015元旦家电促销活动策划方案
2014/12/09 职场文书
react使用antd的上传组件实现文件表单一起提交功能(完整代码)
2021/06/29 Javascript
Sleuth+logback 设置traceid 及自定义信息方式
2021/07/26 Java/Android
试用1103暨1103、1101同门大比武 [ DAIWEI ]
2022/04/05 无线电
Elasticsearch6.2服务器升配后的bug(避坑指南)
2022/09/23 Servers