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数据结构与算法(PHP描述) 快速排序 quick sort
Jun 21 PHP
ThinkPHP页面跳转success与error方法概述
Jun 25 PHP
PHP利用MySQL保存session的实现思路及示例代码
Sep 09 PHP
PIGCMS 如何关闭聊天机器人
Feb 12 PHP
php判断linux下程序问题实例
Jul 09 PHP
Symfony2框架创建项目与模板设置实例详解
Mar 17 PHP
php数据访问之查询关键字
May 09 PHP
PHP针对多用户实现更换头像功能
Sep 04 PHP
php用户密码加密算法分析【Discuz加密算法】
Oct 12 PHP
php+redis实现多台服务器内网存储session并读取示例
Jan 12 PHP
老生常谈PHP面向对象之标识映射
Jun 21 PHP
PHP设计模式之策略模式原理与用法实例分析
Apr 04 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
基于wordpress主题制作的具体实现步骤
2013/05/10 PHP
PHP autoload与spl_autoload自动加载机制的深入理解
2013/06/05 PHP
浅析Yii2缓存的使用
2016/05/10 PHP
简单谈谈PHP面向对象之标识对象
2017/06/27 PHP
php变量与JS变量实现不通过跳转直接交互的方法
2017/08/25 PHP
laravel实现上传图片,并且制作缩略图,按照日期存放的代码
2019/10/16 PHP
js渐变显示渐变消失示例代码
2013/08/01 Javascript
判断滚动条到底部的JS代码
2013/11/04 Javascript
js sort 二维数组排序的用法小结
2014/01/24 Javascript
基于jquery实现的可编辑下拉框实现代码
2014/08/02 Javascript
jQuery中DOM树操作之复制元素的方法
2015/01/23 Javascript
jquery 实现输入邮箱时自动补全下拉提示功能
2015/10/04 Javascript
jQuery实现漂亮实用的商品图片tips提示框效果(无图片箭头+阴影)
2016/04/16 Javascript
用JS写的一个Ajax库(实例代码)
2016/08/06 Javascript
Node.js如何响应Ajax的POST请求并且保存为JSON文件详解
2017/03/10 Javascript
vue 中自定义指令改变data中的值
2017/06/02 Javascript
详解js创建对象的几种方法及继承
2019/04/12 Javascript
python3+PyQt5实现使用剪贴板做复制与粘帖示例
2017/01/24 Python
Python读取图片为16进制表示简单代码
2018/01/19 Python
详解Python给照片换底色(蓝底换红底)
2019/03/22 Python
Python基本数据结构之字典类型dict用法分析
2019/06/08 Python
Python实现Selenium自动化Page模式
2019/07/14 Python
python绘制规则网络图形实例
2019/12/09 Python
详解python变量与数据类型
2020/08/25 Python
Django如何批量创建Model
2020/09/01 Python
python 5个顶级异步框架推荐
2020/09/09 Python
孕妇装中的著名品牌:Isabella Oliver(伊莎贝拉·奥利弗)
2016/10/31 全球购物
俄罗斯鲜花递送:AMF
2020/04/24 全球购物
Vrbo英国:预订度假屋
2020/08/19 全球购物
英国婴儿产品专家:Samuel Johnston
2020/04/20 全球购物
财务方面个人工作的自我评价
2013/12/28 职场文书
运动会广播稿100字
2014/01/11 职场文书
幼儿园教师辞职信
2014/01/18 职场文书
营销总经理岗位职责
2014/02/02 职场文书
新年寄语2016
2015/08/17 职场文书
新娘婚礼答谢词
2015/09/29 职场文书