PHP数组排序函数array_multisort()函数详解

原文:https://blog.lmlyz.online
array_multisort()这个函数可以对多个PHP数组进行排序,排序结果是所有的数组都按第一个数组的顺序进行排列——有点拗口,真的,并且我要只是这样说你一定也不明白。先举个例子:

例如array_multisort( a , a, a,b), a , a, a,b是两个数组,如果排序之后, a 数 组 的 第 3 个 元 素 被 排 到 了 第 一 位 , 那 么 a数组的第3个元素被排到了第一位,那么 a3b的第三个元素不管他在$b中的大小都会排在第一位。看看下边的程序运行结果:

$a =array(100,80,50,10,0);
$b = array("c","f","q","e","z");
array_multisort($a,$b);
var_dump($a);
var_dump($b);

运行结果:
array(5) { [0]=> int(0) [1]=> int(10) [2]=> int(50) [3]=> int(80) [4]=> int(100) }
array(5) { [0]=> string(1) “z” [1]=> string(1) “e” [2]=> string(1) “q” [3]=> string(1) “f” [4]=> string(1) “c” }

很显然本来是数组b第五个元素的z被排到了第一位!

其实说明白了就是,array_multisort()先把第一个数组按照键值的大小排序,然后其它数组都按照第一个数组的调整策略进行调整——第三个元素放到第一位,第二个元素放到第二位……——其实这个多维数组排序算法的最基本体现!

不过需要注意的是:两个数组的元素个数必须相同,不然就会出现一个警告信息:
Warning: array_multisort() [function.array-multisort]: Array sizes are inconsistent in ……

好了,希望上边的大家也能用上,咱们还是说主要的吧:array_multisort()对多维数组进行排序,这个功能将来做项目的时候是非常有用的!

首先我们看看对多维数组的每一元素[数组]进行排序的操作方法,很简单,但是有几个参数需要说明一下,如果您对sql有所了解一看估计就明白了:

//让我们来构造一个多维数组
$a=array(100,2,4,7,7);
$b=array('ab','ac','ad','ag','ap');
 
$ab = array($a,$b);
//开始排序
array_multisort($ab[0],SORT_NUMERIC,SORT_DESC,$ab[1],SORT_STRING,SORT_ASC);
print_r($ab);

说明一下:首先我们用SORT_NUMERIC来声明对 a b [ 0 ] 用 数 字 类 型 排 序 , 用 S O R T D E S C 声 明 顺 序 是 逆 序 ( 从 大 到 小 ) , 然 后 我 们 对 ab[0]用数字类型排序,用SORT_DESC 声明顺序是逆序(从大到小),然后我们对 ab[0]SORTDESCab[1]用字符串类型排序,顺序是升序(顺序)
最后数组 a b 的 排 序 结 果 是 两 者 的 结 合 , 先 按 ab的排序结果是两者的结合,先按 abab[0]的逆序,如果 a b [ 0 ] 中 存 在 大 小 相 同 的 数 值 则 按 照 ab[0]中存在大小相同的数值则按照 ab[0]ab[1]的顺序排列,输出结果如下:

Array (
[0] => Array ( [0] => 100 [1] => 7 [2] => 7 [3] => 4 [4] => 2 )
[1] => Array ( [0] => ab [1] => ag [2] => ap [3] => ad [4] => ac )
)
是不是很像在数据库中用order by?其实真的差不多!

现在我们再看一个更加贴近实际应用的例子:

$array[] = array("age"=>20,"name"=>"li");
$array[] = array("age"=>21,"name"=>"ai");
$array[] = array("age"=>20,"name"=>"ci");
$array[] = array("age"=>22,"name"=>"di");
 
foreach ($array as $key=>$value){
 $age[$key] = $value['age'];
 $name[$key] = $value['name'];
}
 
array_multisort($age,SORT_NUMERIC,SORT_DESC,$name,SORT_STRING,SORT_ASC,$array);
print_r($array);

这个例子的 a r r a y [ ] 数 组 , 是 按 照 数 据 库 中 读 出 的 记 录 来 构 造 的 , 我 们 现 在 对 他 们 按 照 年 龄 从 大 到 小 的 顺 序 排 列 , 如 果 年 龄 相 同 就 按 照 名 字 的 顺 序 排 序 。 这 样 的 排 序 才 是 我 们 将 来 会 经 常 用 的 到 的 , 因 为 a r r a y m u l t i s o r t ( ) 需 要 的 排 序 参 数 必 须 是 一 个 列 , 所 以 我 们 用 f o r e a c h 把 这 个 数 组 的 年 龄 和 姓 名 读 出 来 , 之 后 呢 ? 就 像 上 边 的 例 子 一 样 , 进 行 排 序 , 最 后 一 个 参 数 array[]数组,是按照数据库中读出的记录来构造的,我们现在对他们按照年龄从大到小的顺序排列,如果年龄相同就按照名字的顺序排序。这样的排序才是我们将来会经常用的到的, 因为array_multisort()需要的排序参数必须是一个列,所以我们用foreach把这个数组的年龄和姓名读出来,之后呢? 就像上边的例子一样,进行排序,最后一个参数 array[]arraymultisort()foreacharray想必大家也看见了,是的这里需要声明对哪个数组进行排序,因为我们前边两个参数在形式上已经和需要排序的PHP数组没有关系了,虽然其实他们就是 a r r a y 中 的 数 据 — — 我 们 从 array中的数据——我们从 arrayarray中抽取的列——排序当然是需要列,还没见过用行数据进行排序的呢!

输出结果如下——正如我们所想的:
Array (
[0] => Array ( [age] => 22 [name] => di )
[1] => Array ( [age] => 21 [name] => ai )
[2] => Array ( [age] => 20 [name] => ci )
[3] => Array ( [age] => 20 [name] => li )
)

看到了吧,其实也很简单,就是那几个需要大写的参数有点烦人而已!虽说也有点难以理解,但是理解了就好了,将来很有用的哦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值