PHP array_multisort()函数的使用札记


Posted in PHP onJuly 03, 2011

函数

bool array_multisort ( array &$arr [, mixed $arg = SORT_ASC [, mixed $arg = SORT_REGULAR [, mixed $...]]] )
参数说明: 函数对多个数组或多维数组进行排序
第一个参数是数组,随后的每一个参数可能是数组,也可能是下面的排序顺序标志
SORT_ASC - 默认,按升序排列
SORT_DESC - 按降序排列
随后可以指定排序的类型
SORT_REGULAR - 默认。将每一项按常规顺序排列。
SORT_NUMERIC - 将每一项按数字顺序排列。
SORT_STRING - 将每一项按字母顺序排列。
实例代码

$arr1 = array('10', 11, 100, 100, 'a'); 
$arr2 = array(1, 2, 3, '2', 5); 
array_multisort($arr1, $arr2);

结果为:
$arr1
Array ( [0] => 10 [1] => a [2] => 11 [3] => 100 [4] => 100 )
# '10'在与11, 100, 100比较时转换为整数10,小于其他三个数
# '10'在于'a'比较时作为字符串,其第一个字符'1'ascii码值为49小于‘a'(ascii值为97),所以‘10'为最小元素
# 'a'在于其他三个数字比较时,转换为整数0,小于其他三个数
$arr2
Array ( [0] => 1 [1] => 5 [2] => 2 [3] => 2 [4] => 3 )
# $arr2元素1与$arr1元素'10'位置对应,所以排在[0]位置
# $arr1[2] => 100, $arr1[3] => 100分别对应$arr2元素3, '2'。3大于'2',所以与2对应的$arr1[2] => 100排序后的下标为
3,与3对应的$arr1[3] => 100排序的下标为4
总结
1.参与排序的数组元素数保持一致
2.排序数组元素位置对应如, ‘10' => 1 , 11 => 2
3.后边的数组在前边数组的顺序的基础上进行排序
4.前边的数组如遇相等的元素则比较后边的数组

array_multisort — 对多个数组或多维数组进行排序

说明
bool array_multisort ( array $ar1 [, mixed $arg [, mixed $... [, array $... ]]] )
成功时返回 TRUE, 或者在失败时返回 FALSE.

array_multisort() 可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。

关联(string)键名保持不变,但数字键名会被重新索引。

输入数组被当成一个表的列并以行来排序——这类似于 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话就按照下一个输入数组中相应值的大小来排序,依此类推。

本函数的参数结构有些不同寻常,但是非常灵活。第一个参数必须是一个数组。接下来的每个参数可以是数组或者是下面列出的排序标志。

排序顺序标志:

SORT_ASC - 按照上升顺序排序
SORT_DESC - 按照下降顺序排序

排序类型标志:

SORT_REGULAR - 将项目按照通常方法比较
SORT_NUMERIC - 将项目按照数值比较
SORT_STRING - 将项目按照字符串比较

每个数组之后不能指定两个同类的排序标志。每个数组后指定的排序标志仅对该数组有效 - 在此之前为默认值 SORT_ASC 和 SORT_REGULAR。

#1 对多个数组排序

<?php 
$ar1 = array("10", 100, 100, "a"); 
$ar2 = array(1, 3, "2", 1); 
array_multisort($ar1, $ar2); 
var_dump($ar1); 
var_dump($ar2); 
?>

本例中经过排序后,第一个数组将包含 "10","a",100,100。第二个数组将包含 1,1,"2",3。第二个数组中的项目顺序完全和第一个数组中相应的项目(100 和 100)顺序一致。
array(4) { 
[0]=> string(2) "10" 
[1]=> string(1) "a" 
[2]=> int(100) 
[3]=> int(100) 
} 
array(4) { 
[0]=> int(1) 
[1]=> int(1) 
[2]=> string(1) "2" 
[3]=> int(3) 
}

#2 对多维数组排序
<?php 
$ar = array (array ("10", 100, 100, "a"), array (1, 3, "2", 1)); 
array_multisort ($ar[0], SORT_ASC, SORT_STRING, 
$ar[1], SORT_NUMERIC, SORT_DESC); 
?>

本例中经过排序后,第一个数组将包含 10,100,100,"a"(作为字符串上升排序),第二个数组将包含 1,3,"2",1(作为数值下降排序)。

#3 Sorting multi-dimensional array

<?php 
$ar = array( 
array("10", 11, 100, 100, "a"), 
array( 1, 2, "2", 3, 1) 
); 
array_multisort($ar[0], SORT_ASC, SORT_STRING, 
$ar[1], SORT_NUMERIC, SORT_DESC); 
var_dump($ar); 
?>

本例中在排序后,第一个数组将变成 "10",100,100,11,"a"(被当作字符串以升序排列)。第二个数组将包含 1, 3, "2", 2, 1(被当作数字以降序排列)。
array(2) { 
[0]=> array(5) { 
[0]=> string(2) "10" 
[1]=> int(100) 
[2]=> int(100) 
[3]=> int(11) 
[4]=> string(1) "a" 
} 
[1]=> array(5) { 
[0]=> int(1) 
[1]=> int(3) 
[2]=> string(1) "2" 
[3]=> int(2) 
[4]=> int(1) 
} 
}

#4 对数据库结果进行排序
本例中 data 数组中的每个单元表示一个表中的一行。这是典型的数据库记录的数据集合。

例子中的数据如下:

volume | edition
-------+--------
67 | 2
86 | 1
85 | 6
98 | 2
86 | 6
67 | 7

数据全都存放在名为 data 的数组中。这通常是通过循环从数据库取得的结果,例如 mysql_fetch_assoc()。

<?php
$data[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7);
?>
本例中将把 volume 降序排列,把 edition 升序排列。

现在有了包含有行的数组,但是 array_multisort() 需要一个包含列的数组,因此用以下代码来取得列,然后排序。

<?php
// 取得列的列表
foreach ($data as $key => $row) {
$volume[$key] = $row['volume'];
$edition[$key] = $row['edition'];
}

// 将数据根据 volume 降序排列,根据 edition 升序排列
// 把 $data 作为最后一个参数,以通用键排序
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
?>
数据集合现在排好序了,结果如下:

volume | edition
-------+--------
98 | 2
86 | 1
86 | 6
85 | 6
67 | 2
67 | 7

Example #5 不区分大小写字母排序

SORT_STRING 和 SORT_REGULAR 都是区分大小写字母的,大写字母会排在小写字母之前。

要进行不区分大小写的排序,就要按照原数组的小写字母拷贝来排序。

<?php 
$array = array('Alpha', 'atomic', 'Beta', 'bank'); 
$array_lowercase = array_map('strtolower', $array); array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $array); 
print_r($array); 
?>

以上例程会输出:

Array
(
[0] => Alpha
[1] => atomic
[2] => bank
[3] => Beta
)

【译者注】本函数相当有用,为有助于理解,请再看下面这个例子:

Example #6 名次排列

<?php 
$grade = array("score" => array(70, 95, 70.0, 60, "70"), 
"name" => array("Zhang San", "Li Si", "Wang Wu", 
"Zhao Liu", "Liu Qi")); 
array_multisort($grade["score"], SORT_NUMERIC, SORT_DESC, 
// 将分数作为数值,由高到低排序 
$grade["name"], SORT_STRING, SORT_ASC); 
// 将名字作为字符串,由小到大排序 
var_dump($grade); 
?>

以上例程会输出:

array(2) {
["score"]=>
array(5) {
[0]=>
int(95)
[1]=>
string(2) "70"
[2]=>
float(70)
[3]=>
int(70)
[4]=>
int(60)
}
["name"]=>
array(5) {
[0]=>
string(5) "Li Si"
[1]=>
string(6) "Liu Qi"
[2]=>
string(7) "Wang Wu"
[3]=>
string(9) "Zhang San"
[4]=>
string(8) "Zhao Liu"
}
}
本例中对包含成绩的数组 $grade 按照分数(score)由高到低进行排序,分数相同的人则按照名字(name)由小到大排序。排序后李四 95 分为第一名,赵六 60 分为第五名没有异议。张三、王五和刘七都是 70 分,他们的名次则由其姓名的字母顺序排列,Liu 在前,Wang 在后而 Zhang 在最后。为了区别,三个 70 分分别用了整数,浮点数和字符串来表示,可以在程序输出中清楚地看到它们排序的结果。

PHP 相关文章推荐
在php中判断一个请求是ajax请求还是普通请求的方法
Jun 28 PHP
三个类概括PHP的五种设计模式
Sep 05 PHP
php获取服务器信息的实现代码
Feb 04 PHP
解析PHP SPL标准库的用法(遍历目录,查找固定条件的文件)
Jun 18 PHP
PHP仿博客园 个人博客(2) 数据库增添改删
Jul 05 PHP
php实现斐波那契数列的简单写法
Jul 19 PHP
php opendir()列出目录下所有文件的实例代码
Oct 02 PHP
PHP进程通信基础之信号量与共享内存通信
Feb 19 PHP
利用Homestead快速运行一个Laravel项目的方法详解
Nov 14 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
Dec 21 PHP
PHP钩子实现方法解析
May 21 PHP
PHPstorm激活码2020年5月13日亲测有效
Sep 17 PHP
PHP导出MySQL数据到Excel文件(fputcsv)
Jul 03 #PHP
PHP include_path设置技巧分享
Jul 03 #PHP
php array_intersect比array_diff快(附详细的使用说明)
Jul 03 #PHP
php header Content-Type类型小结
Jul 03 #PHP
php中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
Jul 03 #PHP
PHP采集利器 Snoopy 试用心得
Jul 03 #PHP
php中的三元运算符使用说明
Jul 03 #PHP
You might like
php Smarty模板生成html文档的方法
2010/04/12 PHP
PHP中读取照片exif信息的方法
2014/08/20 PHP
php清空(删除)指定目录下的文件,不删除目录文件夹的实现代码
2014/09/04 PHP
apache中为php 设置虚拟目录
2014/12/17 PHP
初学JavaScript第二章
2008/09/30 Javascript
javascript document.execCommand() 常用解析
2009/12/14 Javascript
jquery插件制作 图片走廊 gallery
2012/08/17 Javascript
Dom 学习总结以及实例的使用介绍
2013/04/24 Javascript
用JavaScript实现类似于ListBox功能示例代码
2014/03/09 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
2016/09/06 Javascript
jQuery事件绑定用法详解
2016/09/08 Javascript
微信小程序  自定义创建详细介绍
2016/10/27 Javascript
js判断一个字符串是以某个字符串开头的简单实例
2016/12/27 Javascript
Angular下H5上传图片的方法(可多张上传)
2017/01/09 Javascript
nodejs实现发出蜂鸣声音(系统报警声)的方法
2017/01/18 NodeJs
原生JS实现幻灯片
2017/02/22 Javascript
JS正则替换去空格的方法
2017/03/24 Javascript
AngularJS日程表案例详解
2017/08/15 Javascript
bootstrap时间插件daterangepicker使用详解
2017/10/19 Javascript
JavaScript之创意时钟项目(实例讲解)
2017/10/23 Javascript
vue.js中$set与数组更新方法
2018/03/08 Javascript
JS中的JSON对象的定义和取值实现代码
2018/05/09 Javascript
详解JavaScript中的强制类型转换
2019/04/15 Javascript
vue路由中前进后退的一些事儿
2019/05/18 Javascript
javascript面向对象三大特征之继承实例详解
2019/07/24 Javascript
vue用BMap百度地图实现即时搜索功能
2019/09/26 Javascript
详解一些适用于Node.js的命名约定
2019/12/08 Javascript
python3编码问题汇总
2016/09/06 Python
python脚本调用iftop 统计业务应用流量的思路详解
2019/10/11 Python
解决django框架model中外键不落实到数据库问题
2020/05/20 Python
师范生实习的个人自我鉴定
2013/10/20 职场文书
财务人员的自我评价范文
2014/03/03 职场文书
机电职业生涯规划书范文
2014/03/08 职场文书
企业党建工作总结2015
2015/05/26 职场文书
2019年家电促销广告语集锦
2019/10/21 职场文书
新的CSS 伪类函数 :is() 和 :where()示例详解
2022/08/05 HTML / CSS