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 正则表达式小结
Aug 31 PHP
延长phpmyadmin登录时间的方法
Feb 06 PHP
fleaphp crud操作之findByField函数的使用方法
Apr 23 PHP
MySQL 日期时间函数常用总结
Jun 12 PHP
用PHP实现弹出消息提示框的两种方法
Dec 17 PHP
完美的2个php检测字符串是否是utf-8编码函数分享
Jul 28 PHP
php通过session防url攻击方法
Dec 10 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
Mar 03 PHP
实例讲解yii2.0在php命令行中运行的步骤
Dec 01 PHP
PHP基于Redis消息队列实现发布微博的方法
May 03 PHP
PHP文件类型检查及fileinfo模块安装使用详解
May 09 PHP
laravel model模型处理之修改查询或修改字段时的类型格式案例
Oct 17 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 Switch 语句之学习笔记
2013/09/21 PHP
深入探究PHP的多进程编程方法
2015/08/18 PHP
Zend Framework教程之分发器Zend_Controller_Dispatcher用法详解
2016/03/07 PHP
thinkPHP5.0框架URL访问方法详解
2017/03/18 PHP
yii2中关于加密解密的那些事儿
2018/06/12 PHP
关于使用runtimeStyle属性问题讨论文章
2007/03/08 Javascript
javascript函数库-集合框架
2007/04/27 Javascript
JavaScript多线程的实现方法
2007/05/08 Javascript
验证用户是否修改过页面的数据的实现方法
2008/09/26 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
2014/11/23 Javascript
利用原生JS与jQuery实现数字线性变化的动画
2017/02/24 Javascript
Vue数组更新及过滤排序功能
2017/08/10 Javascript
JS实现的ajax和同源策略(实例讲解)
2017/12/01 Javascript
javascript中的隐式调用
2018/02/10 Javascript
js实现页面多个日期时间倒计时效果
2019/06/20 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
2020/06/29 Javascript
js实现开关灯效果
2020/03/30 Javascript
[04:03]DOTA2英雄梦之声_第02期_风暴之灵
2014/06/30 DOTA
Python字符串处理之count()方法的使用
2015/05/18 Python
Python使用当前时间、随机数产生一个唯一数字的方法
2017/09/18 Python
Python走楼梯问题解决方法示例
2018/07/25 Python
Python Matplotlib库安装与基本作图示例
2019/01/09 Python
python实现诗歌游戏(类继承)
2019/02/26 Python
浅谈Python中eval的强大与危害
2019/03/13 Python
Appium+python自动化怎么查看程序所占端口号和IP
2019/06/14 Python
使用python将excel数据导入数据库过程详解
2019/08/27 Python
基于python的列表list和集合set操作
2019/11/24 Python
Django Channel实时推送与聊天的示例代码
2020/04/30 Python
水上运动奥特莱斯:Wasterports Outlet
2018/08/08 全球购物
德国亚洲食品网上商店:asiafoodland.de
2019/12/28 全球购物
大学生农村教师实习自我鉴定
2013/09/21 职场文书
工程造价专业大专生求职信
2013/10/06 职场文书
《会变的花树叶》教学反思
2014/02/10 职场文书
服务标兵事迹材料
2014/05/04 职场文书
应届生求职自荐信范文
2015/03/04 职场文书
MongoDB数据库之添删改查
2022/04/26 MongoDB