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新手上路(十一)
Oct 09 PHP
pw的一个放后门的方法分析
Oct 08 PHP
解析阿里云ubuntu12.04环境下配置Apache+PHP+PHPmyadmin+MYsql
Jun 26 PHP
PHP将两个关联数组合并函数提高函数效率
Mar 18 PHP
php根据生日计算年龄的方法
Jul 13 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
Aug 28 PHP
PHP实现动态执行代码的方法
Mar 25 PHP
php插件Xajax使用方法详解
Aug 31 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
PHP封装XML和JSON格式数据接口操作示例
Mar 06 PHP
php ActiveMQ的安装与使用方法图文教程
Feb 23 PHP
PHP 实现链式操作
Mar 09 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强制运行广告的方法
2014/12/01 PHP
PHP实现根据密码长度显示安全条
2017/07/04 PHP
JS获取图片实际宽高及根据图片大小进行自适应
2013/08/11 Javascript
JavaScript动态操作表格实例(添加,删除行,列及单元格)
2013/11/25 Javascript
JavaScript cookie的设置获取删除详解
2014/02/11 Javascript
Jquery树插件zTree用法入门教程
2015/02/17 Javascript
jQuery使用fadein方法实现渐出效果实例
2015/03/27 Javascript
分享我的jquery实现下拉菜单心的
2015/11/29 Javascript
confirm确认对话框的实现方法总结
2016/06/17 Javascript
js表单元素checked、radio被选中的几种方法(详解)
2016/08/22 Javascript
基于JS代码实现简单易用的倒计时 x 天 x 时 x 分 x 秒效果
2017/07/13 Javascript
Angularjs中数据绑定的实例详解
2017/08/25 Javascript
ionic3+Angular4实现接口请求及本地json文件读取示例
2017/10/11 Javascript
Vue 拦截器对token过期处理方法
2018/01/23 Javascript
解决vue+element 键盘回车事件导致页面刷新的问题
2018/08/25 Javascript
vue+Element-ui实现分页效果实例代码详解
2018/12/10 Javascript
浅析JavaScript 函数柯里化
2020/09/08 Javascript
Python中标准模块importlib详解
2017/04/16 Python
python对excel文档去重及求和的实例
2018/04/18 Python
python 实现敏感词过滤的方法
2019/01/21 Python
Pycharm保存不能自动同步到远程服务器的解决方法
2019/06/27 Python
Python检查 云备份进程是否正常运行代码实例
2019/08/22 Python
python3实现简单飞机大战
2020/11/29 Python
CSS3正方体旋转示例代码
2013/08/08 HTML / CSS
台湾森森购物网:U-mall
2017/10/16 全球购物
Yahoo-PHP面试题2
2014/12/06 面试题
MYSQL基础面试题
2012/05/13 面试题
夜大毕业自我鉴定
2013/10/11 职场文书
感恩寄语大全
2014/04/11 职场文书
学习雷锋演讲稿
2014/05/10 职场文书
消防安全宣传标语
2014/06/07 职场文书
运动会广播稿诗歌版
2014/09/12 职场文书
一般纳税人申请报告
2015/05/18 职场文书
2015大学迎新晚会主持词
2015/07/16 职场文书
学习十八大的感悟
2015/08/11 职场文书
Android学习之BottomSheetDialog组件的使用
2022/06/21 Java/Android