PHP 多维数组排序实现代码


Posted in PHP onAugust 05, 2009

array_multisort
(PHP 4, PHP 5)
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

例子 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
)

【译者注】本函数相当有用,为有助于理解,请再看下面这个例子:
例子 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中PDO解决中文乱码问题的一些补充
Sep 06 PHP
php结合表单实现一些简单功能的例子
Jun 04 PHP
PHP教程之PHP中shell脚本的使用方法分享
Feb 23 PHP
从PHP的源码中深入了解stdClass类
Apr 18 PHP
PHP缓存机制Output Control详解
Jul 14 PHP
PHP实现的QQ空间g_tk加密算法
Jul 09 PHP
PHP实现的简单分页类及用法示例
May 06 PHP
php实现微信支付之企业付款
May 30 PHP
php基于Redis消息队列实现的消息推送的方法
Nov 28 PHP
Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法
Apr 02 PHP
Yii框架getter与setter方法功能与用法分析
Oct 22 PHP
php7 list()、session及其他模块的修改实例分析
May 25 PHP
PHP 简单数组排序实现代码
Aug 05 #PHP
用php获取本周,上周,本月,上月,本季度日期的代码
Aug 05 #PHP
一些 PHP 管理系统程序中的后门
Aug 05 #PHP
黑夜路人出的几道php笔试题
Aug 04 #PHP
谈谈新手如何学习PHP 默默经典版本
Aug 04 #PHP
用PHP的ob_start() 控制您的浏览器cache
Aug 03 #PHP
一贴学会PHP 新手入门教程
Aug 03 #PHP
You might like
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
2009/03/13 PHP
PHP伪静态Rewrite设置之APACHE篇
2014/07/30 PHP
php实现把url转换迅雷thunder资源下载地址的方法
2014/11/07 PHP
3种php生成唯一id的方法
2015/11/23 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
javascript YUI 读码日记之 YAHOO.util.Dom - Part.4
2008/03/22 Javascript
JS动态获取当前时间,并写到特定的区域
2013/05/03 Javascript
jquery获取iframe中的dom对象(两种方法)
2013/07/02 Javascript
JavaScript编程的10个实用小技巧
2014/04/18 Javascript
轻松创建nodejs服务器(5):事件处理程序
2014/12/18 NodeJs
使用jQuery实现图片遮罩半透明坠落遮挡
2015/03/16 Javascript
bootstrap daterangepicker双日历时间段选择控件详解
2017/06/15 Javascript
简单的vuex 的使用案例笔记
2018/04/13 Javascript
Vue实现双向绑定的原理以及响应式数据的方法
2018/07/02 Javascript
微信小程序数据分析之自定义分析的实现
2018/08/17 Javascript
Vue CLI3 开启gzip压缩文件的方式
2018/09/30 Javascript
vue style width a href动态拼接问题的解决
2020/08/07 Javascript
python批量导出导入MySQL用户的方法
2013/11/15 Python
python的keyword模块用法实例分析
2015/06/30 Python
python中使用zip函数出现错误的原因
2018/09/28 Python
python:接口间数据传递与调用方法
2018/12/17 Python
对pandas的算术运算和数据对齐实例详解
2018/12/22 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
2019/03/14 Python
计算机二级python学习教程(1) 教大家如何学习python
2019/05/16 Python
Django Admin中增加导出Excel功能过程解析
2019/09/04 Python
校园之星获奖感言
2014/01/29 职场文书
工作睡觉检讨书
2014/02/25 职场文书
《奇妙的国际互联网》 教学反思
2014/02/25 职场文书
关于读书的活动方案
2014/08/14 职场文书
银行奉献演讲稿
2014/09/16 职场文书
四风问题个人自查剖析材料思想汇报
2014/09/21 职场文书
什么是创业计划书?什么是商业计划书?这里一一解答
2019/07/12 职场文书
MySQL系列之六 用户与授权
2021/07/02 MySQL
新手初学Java网络编程
2021/07/07 Java/Android
mybatis 获取无数据的字段不显示的问题
2021/07/15 Java/Android
MySQL限制查询和数据排序介绍
2022/03/25 MySQL