PHP array_multisort() 函数的深入解析


Posted in PHP onJune 20, 2013

一、先看最简单的情况。有两个数组:
$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 相关文章推荐
一个程序下载的管理程序(二)
Oct 09 PHP
杏林同学录(八)
Oct 09 PHP
Discuz 5.0 中读取纯真IP数据库函数分析
Mar 16 PHP
ThinkPHP中实例Model方法的区别说明
Aug 21 PHP
PHP设计模式之装饰者模式
Feb 29 PHP
关于PHPDocument 代码注释规范的总结
Jun 25 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
Jun 25 PHP
Codeigniter的一些优秀特性总结
Jan 21 PHP
PHP面向对象程序设计实例分析
Jan 26 PHP
Symfony2框架创建项目与模板设置实例详解
Mar 17 PHP
PHP正则表达式入门教程(推荐)
May 18 PHP
laravel使用数据库测试注意事项
Apr 10 PHP
PHP操作MongoDB GridFS 存储文件的详解
Jun 20 #PHP
解析Linux下Varnish缓存的配置优化
Jun 20 #PHP
解析PHP中常见的mongodb查询操作
Jun 20 #PHP
PHP 解决session死锁的方法
Jun 20 #PHP
解析PHP可变函数的经典用法
Jun 20 #PHP
使用PHP求两个文件的相对路径
Jun 20 #PHP
基于PHP服务端图片生成缩略图的方法详解
Jun 20 #PHP
You might like
php验证是否是md5编码的简单代码
2014/04/01 PHP
PHP url的pathinfo模式加载不同控制器的简单实现
2016/08/12 PHP
复制Input内容的js代码_支持所有浏览器,修正了Firefox3.5以上的问题
2010/06/21 Javascript
jQuery的实现原理的模拟代码 -4 重要的扩展函数 extend
2010/08/03 Javascript
JS中toFixed()方法引起的问题如何解决
2012/11/20 Javascript
javascript实现div的显示和隐藏的小例子
2013/06/25 Javascript
关于Javascript与iframe的那些事儿
2013/07/04 Javascript
JavaScript函数学习总结以及相关的编程习惯指南
2015/11/16 Javascript
JS及PHP代码编写八大排序算法
2016/07/12 Javascript
Angular设置别名alias的方法
2018/11/08 Javascript
Makefile/cmake/node-gyp中区分判断不同平台的方法
2018/12/18 Javascript
推荐15个最好用的JavaScript代码压缩工具
2019/02/13 Javascript
JavaScript实现选项卡效果的分析及步骤
2019/04/16 Javascript
vue-test-utils初使用详解
2019/05/23 Javascript
layui监听下拉选框选中值变化的方法(包含监听普通下拉选框)
2019/09/24 Javascript
Openlayers实现地图的基本操作
2020/09/28 Javascript
go语言计算两个时间的时间差方法
2015/03/13 Python
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
2017/09/28 Python
pandas 获取季度,月度,年度首尾日期的方法
2018/04/11 Python
基于DATAFRAME中元素的读取与修改方法
2018/06/08 Python
Python minidom模块用法示例【DOM写入和解析XML】
2019/03/25 Python
PyQt5图形界面播放音乐的实例
2019/06/17 Python
查看端口并杀进程python脚本代码
2019/12/17 Python
解决pytorch报错:AssertionError: Invalid device id的问题
2020/01/10 Python
Python中常用的高阶函数实例详解
2020/02/21 Python
基于python实现模拟数据结构模型
2020/06/12 Python
酒吧总经理岗位职责
2013/12/10 职场文书
工程专业应届生求职信
2014/02/19 职场文书
材料专业毕业生求职信
2014/02/26 职场文书
邹越感恩父母演讲稿
2014/08/28 职场文书
2014年大堂经理工作总结
2014/11/21 职场文书
Python基础知识学习之类的继承
2021/05/31 Python
WebWorker 封装 JavaScript 沙箱详情
2021/11/02 Javascript
什么是SOLID
2022/03/24 Javascript
在容器中使用nginx搭建上传下载服务器
2022/05/11 Servers
python数字图像处理数据类型及颜色空间转换
2022/06/28 Python