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和ACCESS写聊天室(八)
Oct 09 PHP
php 生成随机验证码图片代码
Feb 08 PHP
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
Aug 09 PHP
php中DOMElement操作xml文档实例演示
Mar 26 PHP
基于PHP遍历数组的方法汇总分析
Jun 08 PHP
PHP超牛逼无限极分类生成树方法
May 11 PHP
php实现通过cookie换肤的方法
Jul 13 PHP
YII Framework框架教程之国际化实现方法
Mar 14 PHP
PHP7常量数组用法分析
Sep 26 PHP
PHP实现活动人选抽奖功能
Apr 19 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
Dec 25 PHP
php+redis消息队列实现抢购功能
Feb 08 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
PHP获取数组长度或某个值出现次数的方法
2015/02/11 PHP
php封装好的人民币数值转中文大写类
2015/12/20 PHP
浅析PHP7新功能及语法变化总结
2016/06/17 PHP
关于php中的json_encode()和json_decode()函数的一些说明
2016/11/20 PHP
yii2项目实战之restful api授权验证详解
2017/05/20 PHP
PHP中常见的密码处理方式和建议总结
2018/10/14 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
2019/07/08 PHP
laravel 配置路由 api和web定义的路由的区别详解
2019/09/03 PHP
SOSO地图API使用(一)在地图上画圆实现思路与代码
2013/01/15 Javascript
jquery鼠标滑过提示title具体实现代码
2013/08/06 Javascript
jsPDF生成pdf后在网页展示实例
2014/01/16 Javascript
node.js中的fs.fchmod方法使用说明
2014/12/16 Javascript
JavaScript中的类(Class)详细介绍
2014/12/30 Javascript
使用JS画图之点、线、面
2015/01/12 Javascript
移动端 一个简单易懂的弹出框
2016/07/06 Javascript
TypeScript入门-接口
2017/03/30 Javascript
js原生方法被覆盖,从新赋值原生的方法
2018/01/02 Javascript
VUE 3D轮播图封装实现方法
2018/07/03 Javascript
详解javascript设计模式三:代理模式
2019/03/25 Javascript
Vue+Bootstrap收藏(点赞)功能逻辑与具体实现
2020/10/22 Javascript
[00:17]天涯墨客一技能展示
2018/08/25 DOTA
Python如何处理大数据?3个技巧效率提升攻略(推荐)
2019/04/15 Python
Django之创建引擎索引报错及解决详解
2019/07/17 Python
python关闭占用端口方式
2019/12/17 Python
pytorch-RNN进行回归曲线预测方式
2020/01/14 Python
Python BeautifulReport可视化报告代码实例
2020/04/13 Python
python能自学吗
2020/06/18 Python
html5 canvas实现跟随鼠标旋转的箭头
2016/03/11 HTML / CSS
html5定位并在百度地图上显示的示例
2014/04/27 HTML / CSS
数字天堂软件测试面试题
2012/12/23 面试题
介绍一下Python中webbrowser的用法
2013/05/07 面试题
2014年计算机专业个人自我评价
2014/01/19 职场文书
2014道德模范事迹材料
2014/02/16 职场文书
2014最新预备党员思想汇报范文:中国梦,我的梦
2014/10/25 职场文书
python 爬取华为应用市场评论
2021/05/29 Python
Python卷积神经网络图片分类框架详解分析
2021/11/07 Python