首页 » Web前端 » php翻转数组技巧_PHP高级编程回归原生态数组排序

php翻转数组技巧_PHP高级编程回归原生态数组排序

访客 2024-10-23 0

扫一扫用手机浏览

文章目录 [+]

4.2.1 一道口试题引发的思考

在我当前任职的公司里,有这样一道口试题,关于数组排序的。
简化和提炼一下,题目是:

请按以下规则,对专辑的歌曲进行排序。
1、按播放次数,从高到低排序。
2、如果播放次数相同,则按收藏人数从高到低排序。
3、如果收藏人数相同,则按下载次数从高到低排序。

php翻转数组技巧_PHP高级编程回归原生态数组排序

并假设有专辑歌曲列表如下:

php翻转数组技巧_PHP高级编程回归原生态数组排序
(图片来自网络侵删)

表4-1 歌曲列表

常日,对付这道题,会有三类答案。

第一类,便是一开始就扎进大学时期的排序算法。
想着从头到尾再重新实现一套冒泡排序算法,或者快速排序算法。
如果能达到性能最优,并且能准确无误快速实现也是不错的做法。
但这更多是偏理论化,实际业务需求开拓中,很少须要自己再重新实现通用的排序算法。
相反,我们只须要能加以利用即可。

以是,第二类答案是,通过最少的代码,快速实现业务需求。
不管你是利用封装好的第三方开源类库,还是PHP原生态供应的数组排序函数,只要能实现以上排序规则即可。
这时,可以利用array_multisort()函数。
这个排序函数功能比较强大,因此理解起来会有点吃力。
根据官方文档的解释,array_multisort() 可以用来一次性对多个数组进行排序,或者根据某一维度或多个维度对多维数组进行排序。

例如,这里,可以这样实现:

<?php// 示例数据$songs = array( array('title' => '宛如彷佛你的温顺', 'play' => 1000, 'like' => 900, 'download' => 800), array('title' => '丁喷鼻香花', 'play' => 2000, 'like' => 700, 'download' => 500), array('title' => '溘然的自我', 'play' => 2000, 'like' => 800, 'download' => 1300), array('title' => '夜空中最亮的星', 'play' => 800, 'like' => 1000, 'download' => 700),);// 初始化赞助数据$playTimes = $likeTimes = $downloadTimes = array();foreach ($songs as $it) { $playTimes[] = $it['play']; $likeTimes[] = $it['like']; $downloadTimes[] = $it['download'];}// 用一行代码,根据多维对多维数组进行排序array_multisort( $playTimes, SORT_DESC, SORT_NUMERIC, // 排序规则1 $likeTimes, SORT_DESC, SORT_NUMERIC, // 排序规则2 $downloadTimes, SORT_DESC, SORT_NUMERIC, // 排序规则3 $songs);print_r($songs);

末了,运行上面代码,可以看到结果输出是:

Array( [0] => Array ( [title] => 溘然的自我 [play] => 2000 [like] => 800 [download] => 1300 ) [1] => Array ( [title] => 丁喷鼻香花 …… ) [2] => Array ( [title] => 宛如彷佛你的温顺 …… ) [3] => Array ( [title] => 夜空中最亮的星 …… ))

除开前面的示例数据,中间只须要大略循环一遍,用于初始化赞助的数据,就可以便捷地实现了上述三个规则的排序。
但这还不是最优的。
我们再来看下第三类答案。

在揭晓第三类答案之前,我们不妨先大略来回顾一下以前在中学时期,当碰着求解一元二次(或更高次方)方程式时,当时我们是怎么办理的?例如这一条方程式:

很大略,我们会先化简,再求解。
即先化简为我们熟习的一元一次方程:

两边求平方根,得到:

以是,末了答案是x=3或x=-1。
这样是不是很大略了?

同样的道理,如果是对付三维的排序我们很陌生,或者说无从下手,那么如果这只是一道一维数组的排序呢,我们是不是可以很大略地处理?

这便是我们所说的,第三类答案——思路最大略的办理方案。
这也是常日所说的降维。
有了新的思路,再来办理就不难矣。
关键点在于,我们要找到一种唯一映射,使得:

然后再按照此映射规则,将三维的比较,降为一维的比较,末了再进行数组排序,就能达到同样的效果。
以下是鉴于当前示例数据的参考实现。

<?php// 三维降一维$points = array();foreach ($songs as $it) { $points[] = 1000000 $it['play'] + 1000 $it['like'] + $it['download'];}// 再排序array_multisort($points,SORT_DESC,SORT_NUMERIC,$songs);

4.2.2 对数组排序的理解

关于PHP数组的排序函数有好几个,但常日开拓同学只记得sort(),ksort(),更多其他的排序函数就记不住,或者没有印象了。
下面将分享如何快速记住这些排序函数的技巧。

从官方文档摘录的,对数组排序的函数有:

array_multisort()asort()arsort()krsort()ksort()natcasesort()natsort()rsort()shuffle()sort()uasort()uksort()usort()

全部列出来,有13个之多。
那怎么记得住呢?实在,在理科里,都是有技巧的,要靠理解,而非去世记硬背。
就像数学公式一样,要活学活用。

我们都知道,PHP数组由键和值组成,而排序顺序可以是升序,或者是降序。
根据这两个维度,我们可以将上面13个排序函数进行分类。
首先分为两大类:对值排序,和对键排序。
如下面表格所示。

表4-2 数组排序函数

升序

降序

自定义

自然排序

其他

对值排序

sort()、asort()

rsort()、arsort()

usort()、uasort()

natsort()、natcasesort()

shuffle()、array_multisort()

对键排序

ksort()

krsort()

uksort()

对这样的分类清晰后,接着下再来看怎么记住这结函数名称。
可以创造,除了随机排序函数的名称为shuffle()外,其他全部排序函数都因此“sort()”结尾的。

不难创造,函数名称中的这些字母表示的意思分别是:

k:表示键,key的缩写a:表示键值关联的保持(数字类型的不保持),associative的缩写r:表示逆向或者翻转,reverse的缩写u:表示用户自定义,user的缩写

然后,再从最原始的sort()函数开始,若加上首字母a则表示保持索引关系的排序,若加上首字母k则表示对键排序。
由此构成第一梯度排序函数:

sort()、asort()、ksort()

这三个排序函数,若全部在“sort”前加上字母r,则表示降序排序。
从而构成第二梯度排序函数:

rsort()、arsort()、krsort()

如果在第一梯度的三个排序函数最前面加上首字母u,则更大略了。
直接表示用户自定义排序系列的函数,即第三梯度排序函数:

usort()、uasort()、uksort()

末了,剩下的4个函数排序可归为第四梯度排序函数,即综合型的排序,有:

natsort()、natcasesort()、shuffle()、array_multisort()

通过这样的整理,估计你能在更短的韶光内,对PHP的数组排序函数有更深刻的理解。
乃至乎,可以逐渐明白设计PHP这门措辞当时的初衷是多么的奥妙。

标签:

相关文章

QQ伪装黑客代码大全技术与风险警示

网络安全问题日益凸显。QQ作为一种流行的社交工具,成为了黑客攻击的主要目标之一。本文将针对QQ伪装黑客代码大全进行深入剖析,揭示其...

Web前端 2025-03-02 阅读1 评论0