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
snoopy 强大的PHP采集类使用实例代码
Dec 09 PHP
PHP+Mysql+jQuery实现动态展示信息
Oct 08 PHP
解析php函数method_exists()与is_callable()的区别
Jun 21 PHP
解析php框架codeigniter中如何使用框架的session
Jun 24 PHP
如何使用PHP批量去除文件UTF8 BOM信息
Aug 05 PHP
PHP图片上传代码
Nov 04 PHP
Codeigniter出现错误提示Error with CACHE directory的解决方案
Jun 12 PHP
PHP Cookie学习笔记
Aug 23 PHP
smarty模板数学运算示例
Dec 11 PHP
详解使用php调用微信接口上传永久素材
Apr 11 PHP
php+ajax 文件上传代码实例
Mar 18 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获取指定日期之间的各个周和月的起止时间
2014/11/24 PHP
php中有关合并某一字段键值相同的数组合并的改进
2015/03/10 PHP
JavaScript入门教程 Cookies
2009/01/31 Javascript
javascript 数组学习资料收集
2010/04/11 Javascript
网站404页面3秒后跳到首页的实例代码
2013/08/16 Javascript
event对象获取方法总结在google浏览器下测试
2013/11/03 Javascript
Lab.js初次使用笔记
2015/02/28 Javascript
JavaScript使用setTimeout实现延迟弹出警告框的方法
2015/04/07 Javascript
12个非常实用的JavaScript小技巧【推荐】
2016/05/18 Javascript
轮播图组件js代码
2016/08/08 Javascript
用JS中split方法实现彩色文字背景效果实例
2016/08/24 Javascript
AngularJS开发教程之控制器之间的通信方法分析
2016/12/25 Javascript
详解Angular 开发环境搭建
2017/06/22 Javascript
Angular4学习笔记之实现绑定和分包
2017/08/01 Javascript
React进阶学习之组件的解耦之道
2017/08/07 Javascript
浅谈Angular路由守卫
2017/08/26 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
微信小程序利用swiper+css实现购物车商品删除功能
2019/03/06 Javascript
详解django模板与vue.js冲突问题
2019/07/07 Javascript
Node.js fs模块原理及常见用途
2020/10/22 Javascript
Node快速切换版本、版本回退(降级)、版本更新(升级)
2021/01/07 Javascript
python使用arp欺骗伪造网关的方法
2015/04/24 Python
详解Python之数据序列化(json、pickle、shelve)
2017/03/30 Python
Python中的浮点数原理与运算分析
2017/10/12 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
2019/07/23 Python
解决python对齐错误的方法
2020/07/16 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
2020/12/21 Python
Ray-Ban雷朋美国官网:全球领先的太阳眼镜品牌
2016/07/20 全球购物
魔声耳机官方网站:Monster是世界第一品牌的高性能耳机
2016/10/26 全球购物
澳大利亚一站式数码相机商店:CameraPro
2020/03/09 全球购物
信息部岗位职责
2013/11/12 职场文书
商场促销活动方案
2014/02/08 职场文书
个人简历中自我评价
2014/02/11 职场文书
2014年创先争优活动总结
2014/05/04 职场文书
2015年入党积极分子培养考察意见
2015/08/12 职场文书
Redis如何一键部署脚本
2021/04/12 Redis