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 相关文章推荐
PHP4与PHP3中一个不兼容问题的解决方法
Oct 09 PHP
php header功能的使用
Oct 28 PHP
php使用array_rand()函数从数组中随机选择一个或多个元素
Apr 28 PHP
Zend Framework 2.0事件管理器(The EventManager)入门教程
Aug 11 PHP
php下pdo的mysql事务处理用法实例
Dec 27 PHP
PHP实现通过Luhn算法校验信用卡卡号是否有效
Mar 23 PHP
PHP微信开发之二维码生成类
Jun 26 PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
May 12 PHP
PHP自定义函数获取URL中一级域名的方法
Aug 23 PHP
php+redis实现多台服务器内网存储session并读取示例
Jan 12 PHP
laravel利用中间件做防非法登录和权限控制示例
Oct 21 PHP
php引用传递
Apr 01 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图片上传类 附调用方法
2016/05/15 PHP
php 如何禁用eval() 函数实例详解
2016/12/01 PHP
PHP实现字母数字混合验证码功能
2019/07/11 PHP
基于laravel belongsTo使用详解
2019/10/18 PHP
用JavaScript玩转游戏物理(一)运动学模拟与粒子系统
2010/06/19 Javascript
JQuery扩展插件Validate—6 radio、checkbox、select的验证
2011/09/05 Javascript
更换select下拉菜单背景样式的实现代码
2011/12/20 Javascript
JQuery防止退格键网页后退的实现代码
2012/03/23 Javascript
jquery实现浮动在网页右下角的彩票开奖公告窗口代码
2015/09/04 Javascript
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
2016/09/29 Javascript
Javascript 实现简单计算器实例代码
2016/10/23 Javascript
ES6中Generator与异步操作实例分析
2017/03/31 Javascript
Javascript实现从小到大的数组转换成二叉搜索树
2017/06/13 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
2017/08/09 Javascript
vue-i18n结合Element-ui的配置方法
2019/05/20 Javascript
小程序websocket心跳库(websocket-heartbeat-miniprogram)
2020/02/23 Javascript
详解Django中Request对象的相关用法
2015/07/17 Python
Python引用模块和查找模块路径
2016/03/17 Python
Python中shape计算矩阵的方法示例
2017/04/21 Python
python并发2之使用asyncio处理并发
2017/12/21 Python
django允许外部访问的实例讲解
2018/05/14 Python
python Flask 装饰器顺序问题解决
2018/08/08 Python
django 控制页面跳转的例子
2019/08/06 Python
解决python 3 urllib 没有 urlencode 属性的问题
2019/08/22 Python
如何在mac环境中用python处理protobuf
2019/12/25 Python
Python matplotlib修改默认字体的操作
2020/03/05 Python
python tkinter的消息框模块(messagebox,simpledialog)
2020/11/07 Python
用python对excel进行操作(读,写,修改)
2020/12/25 Python
WatchShop法国:英国排名第一的独立手表零售商
2020/02/17 全球购物
秋游活动策划方案
2014/02/16 职场文书
2014全国两会大学生学习心得体会
2014/03/10 职场文书
贯彻学习两会心得体会范文
2014/03/17 职场文书
大学生应聘导游自荐信
2014/06/02 职场文书
服务标语口号
2014/07/01 职场文书
法院个人总结
2015/03/03 职场文书
网络研修随笔感言
2015/11/18 职场文书