前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP 关于数组排序的函数

PHP 关于数组排序的函数

作者头像
写PHP的老王
发布2019-08-12 15:36:54
1.6K0
发布2019-08-12 15:36:54
举报
文章被收录于专栏:写PHP的老王写PHP的老王

php的数组排序函数有很多。有按键排序,有按值排序。有升序,有降序。有的排序后改变原数组索引,有的不改变。

关于PHP的排序函数,官方文档给出了下面的一个总结表:

以上函数排序结果都是通过引用传递到原数组中去,而不是返回一个新的有序的数组。

一维数组排序

其实PHP内部对于数组排序的实现都比较相似,都是一个模子刻出来的。

先看看asort,arsort排序源码:

再来看看sort,rsort排序函数的源码

从上面四个函数的代码对比可以看出,数组排序最终都是通过zend_hash_sort实现的。查看源码,可以发现,除了array_multisort是使用zend_sort实现的外,其他的函数都是通过zend_hash_sort实现。排序方式通过传入的排序函数决定,并通过参数控制是否覆盖原来的索引。

按照这个理解,估计有的人会猜想对于用户自定义函数排序,内部是直接把函数传递到zend_has_sort中去。但是在PHP中其实还加了一层,限定了函数只能作用在键或者值之上。对于函数usortuksort分别是使用自定义函数按值,和按键排序。

用户自定义函数其实是在php_array_user_key_compare,和php_array_user_compare中调用的。

其实归结起来,排序函数就有下面几种

1、sort,按值排序,改变键名,相关有rsort,usort

2、asort,按值排序,不改变键名,相关有arsort,uasort

3、ksort,按键名排序,不改变键名,相关有krsort,uksort

4、nasort,nacasesort自然顺序排序,不改变键名

多数组排序

array_multisort是一个比较奇葩的函数,它的调用形式有很多 比如:

代码语言:javascript
复制
array_multisort(
$volume, SORT_DESC, 
$edition, SORT_ASC, $data
);

或者:

代码语言:javascript
复制
array_multisort(
$ar[0], SORT_ASC, SORT_STRING,
$ar[1], SORT_NUMERIC, SORT_DESC
);

还有这样:

代码语言:javascript
复制
array_multisort($ar1, $ar2);

它内部怎么确定传的参数代表什么意思呢?

可以看到,代码里对数据类型进行判断。如果是数组,都当做排序数组。所以array_multisort可以排序不定个数个数组。顺序,以及排序方式都是通过获取数组之后的整形参数得到。如果没有,那就都默认。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 写PHP的老王 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一维数组排序
  • 多数组排序
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档