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 相关文章推荐
Php Cookie的一个使用注意点
Nov 08 PHP
php 执行系统命令的方法
Jul 07 PHP
PHP学习之数组值的操作
Apr 17 PHP
xml在joomla表单中的应用详解分享
Jul 19 PHP
PHP根据传入参数合并多个JS和CSS文件的简单实现
Jun 13 PHP
thinkphp在模型中自动完成session赋值示例代码
Sep 09 PHP
php实现的Timer页面运行时间监测类
Sep 24 PHP
php获取发送给用户的header信息的方法
Mar 16 PHP
PHP file_get_contents函数读取远程数据超时的解决方法
May 13 PHP
你不知道的文件上传漏洞php代码分析
Sep 29 PHP
浅谈PHP命令执行php文件需要注意的问题
Dec 16 PHP
用Laravel轻松处理千万级数据的方法实现
Dec 25 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循环获取GET和POST值的代码
2008/04/09 PHP
php二维数组排序与默认自然排序的方法介绍
2013/04/27 PHP
基于PHP中的常用函数回顾
2013/07/11 PHP
php 如何获取数组第一个值
2013/08/06 PHP
Yii实现多按钮保存与提交的方法
2014/12/03 PHP
js中如何复制一个对象并获取其所有属性和属性对应的值
2013/10/24 Javascript
jQuery+ajax实现鼠标单击修改内容的思路
2014/06/29 Javascript
jQuery实现在textarea指定位置插入字符或表情的方法
2015/03/11 Javascript
js数组常见操作及数组与字符串相互转化实例详解
2015/11/10 Javascript
jquery 实现滚动条下拉时无限加载的简单实例
2016/06/01 Javascript
微信小程序滚动Tab实现左右可滑动切换
2017/08/17 Javascript
浅谈JavaScript中的属性:如何遍历属性
2017/09/14 Javascript
Vue.js在数组中插入重复数据的实现代码
2017/11/17 Javascript
基于vue cli 通过命令行传参实现多环境配置
2018/07/12 Javascript
vue2 拖动排序 vuedraggable组件的实现
2019/08/08 Javascript
Vue学习之axios的使用方法实例分析
2020/01/06 Javascript
Vue Render函数原理及代码实例解析
2020/07/30 Javascript
vue 获取到数据但却渲染不到页面上的解决方法
2020/11/19 Vue.js
react中hook介绍以及使用教程
2020/12/11 Javascript
python根据出生日期返回年龄的方法
2015/03/26 Python
python smtplib模块自动收发邮件功能(二)
2018/05/22 Python
Python json读写方式和字典相互转化
2020/04/18 Python
Django Auth用户认证组件实现代码
2020/10/13 Python
Python使用tkinter实现小时钟效果
2021/02/22 Python
纯CSS改变webkit内核浏览器的滚动条样式
2014/04/17 HTML / CSS
浅谈three.js中的needsUpdate的应用
2012/11/12 HTML / CSS
AmazeUI底部导航栏与分享按钮的示例代码
2020/08/18 HTML / CSS
知识竞赛活动方案
2014/02/18 职场文书
软环境建设心得体会
2014/09/09 职场文书
机关干部四风问题自查报告及整改措施
2014/10/26 职场文书
爱心捐款感谢信
2015/01/20 职场文书
小学六年级班主任工作经验交流材料
2015/11/02 职场文书
受欢迎的自荐信,就这么写!
2019/04/19 职场文书
OpenCV-Python实现人脸磨皮算法
2021/06/07 Python
Python中的 Set 与 dict
2022/03/13 Python
基于Android10渲染Surface的创建过程
2022/08/14 Java/Android