PHP array_multisort() 函数详解 及 二维数组排序(模拟数据表记录按字段排序)
一、先看最简单的情况。
有两个数组:
$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为另一数据行,5, 4, 8 另一行。
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(
array(
'name' => 'jake',
'score' => 80,
'grade' => 'A'
),
array(
'name' => 'jin',
'score' => 70,
'grade' => 'A'
),
array(
'name' => 'john',
'score' => 80,
'grade' => 'A'
),
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);
就行了。
还能不能更灵活一点呢,每次想排序都要另外弄些数组出来吗?
其实可以经封装几个函数:
<?php
/**
* 根据指定的键对数组排序
*
* 用法:
* <code>
* $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 = list_orderByCol($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),
* // )
* </code>
*
* @param array $array 要排序的数组
* @param string $keyName 排序的键
* @param int $dir 排序方向
* @return array 排序后的数组
*/
function list_orderByCol($array, $keyName, $dir = SORT_ASC)
{
return list_orderByMultiCols($array, array($keyName => $dir));
} /**
* 将一个二维数组按照多个列进行排序,类似 SQL 语句中的 ORDER BY
*
* 用法:
* <code>
* $rows = list_orderByMultiCols($rows, array(
'parent' => SORT_ASC,
'name' => SORT_DESC,
* ));
* </code>
*
* @param array $rowset 要排序的数组/行集
* @param array $args 排序的键
*
* @return array 排序后的数组
*/
function list_orderByMultiCols($rowset, $args)
{
$orderArray = array();
$orderRule = ''; foreach ($args as $orderField => $orderDir)
{
foreach ($rowset as $offset => $row)
{
$orderArray[$orderField][$offset] = $row[$orderField];
}
$orderRule .= '$orderArray[\'' . $orderField . '\'], ' . $orderDir . ', ';
} if (empty($orderArray) || empty($orderRule))
{
return $rowset;
}
eval('array_multisort(' . $orderRule . '$rowset);'); return $rowset;
}
PHP array_multisort() 函数详解 及 二维数组排序(模拟数据表记录按字段排序)的更多相关文章
- PHP数组排序函数array_multisort()函数详解(二)
array_multisort()这个函数可以对多个PHP数组进行排序,排序结果是所有的数组都按第一个数组的顺序进行排列 例如array_multisort($a,$b),$a,$b是两个数组,如果排 ...
- OpenGL一些函数详解(二)
OpenGL ES顶点数据绘制技巧 在OpenGL中,绘制一个长方体,需要将每个顶点的坐标放在一个数组中.保存坐标时有一些技巧(由于字母下标不好表示,因此将下标表示为单引号,如A1将在后文中表示为A' ...
- SQLite函数详解之二
sqlite3支持的数据类型: NULL.INTEGER.REAL.TEXT.BLOB 但是,sqlite3也支持如下的数据类型 smallint 16位整数 integer ...
- PHP数组排序函数array_multisort()函数详解
这个函数因为用到了,并且在网上找了半天终于找到了一个写的通俗易懂的文章,在这里分享给大家. 原文链接:http://blog.163.com/lgh_2002/blog/static/44017526 ...
- 数据导入读取read.table函数详解,如何读取不规则的数据(fill=T)
函数 read.table 是读取矩形格子状数据最为便利的方式.因为实际可能遇到的情况比较多,所以预设了一些函数.这些函数调用了 read.table 但改变了它的一些默认参数. 注意,read.ta ...
- 【R】数据导入读取read.table函数详解,如何读取不规则的数据(fill=T)
函数 read.table 是读取矩形格子状数据最为便利的方式.因为实际可能遇到的情况比较多,所以预设了一些函数.这些函数调用了 read.table 但改变了它的一些默认参数. 注意,read.t ...
- SDUT OJ 图练习-BFS-从起点到目标点的最短步数 (vector二维数组模拟邻接表+bfs , *【模板】 )
图练习-BFS-从起点到目标点的最短步数 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 在古老的魔兽传说中,有两个军团,一个叫天 ...
- PHP数组排序函数array_multisort()函数详解(一)
PHP中array_multisort可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序. 关联(string)键名保持不变,但数字键名会被重新索引. 输入数组被当成一个表的列并以 ...
- PHP实现二维数组排序(按照数组中的某个字段)
亲测可行
随机推荐
- Python KeyError
Google一下轻松找到了答案,大家可以看一下Python Wiki,很简单,翻译如下. 在Python中,当你使用a[key]这种方式从字典中获取一个值时,若字典中不存在这个此key时就会产生一个K ...
- LightOj1089(求点包含几个线段 + 线段树)
题目链接 题意:n( n <= 50000 ) 个线段,q ( q <= 50000) 个点,问每个点在几个线段上 线段端点的和询问的点的值都很大,所以必须离散化 第一种解法:先把所有的线 ...
- 卸载自己编译的程序(ubuntu14.04)
cd 源代码目录make clean./configuremake uninstall
- JavaWeb---总结(七)HttpServletResponse对象(一)
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象. request和response对象即然代表请求和响应,那我们 ...
- java编程思想-java中的并发(二)
二.共享受限资源 有了并发就可以同时做多件事情了.但是,两个或多个线程彼此互相干涉的问题也就出现了.如果不防范这种冲突,就可能发生两个线程同时试图访问同一个银行账户,或向同一个打印机打印,改变同一个值 ...
- myeclipse 破解步骤
Fllow Orders.0. Close MyEclipse Application(if you wanna replace jar file).1. Fill usercode2. Fill s ...
- js 正则表达式提取内容
var wlan = /([a-zA-Z0-9]+)\s+Scan completed :/ var current_wlan="" if (line.match("Sc ...
- mysql if exist坑
TOP:BEGIN #Routine body goes here... IF EXISTS ( SELECT * FROM `user` WHERE `name` = in_user_name ) ...
- Java——不弹起的按钮组件:JToggleButton
import java.awt.GridLayout; import javax.swing.JFrame; import javax.swing.JToggleButton; //========= ...
- (转)JS Date格式化为yyyy-MM-dd类字符串
Date.prototype.format = function(format){ var o = { "M+" : this.getMonth()+1, //month &quo ...