手机排序怎么排序的(买手机的核心指标是什么)
手机排序怎么排序的,买手机的核心指标是什么? 很多人都关注一部手机都会在乎手机的cpu有多强,手机摄像头像素有多高,但这些参数,在我看来,这些...
2023-04-18
PHP里的数组实际上是一个有序映射。不管是队列、数组、栈还是字典,在使用PHP编程时,你都可以统一使用PHP的数组类型。这一节,我们只探讨关于PHP数组的排序,因为数组的排序是很多项目都会使用到的。虽然数据库也可以很方便进行排序,但在复杂、动态的业务规则下,更多需要在PHP代码层进行处理。因此加深对PHP数组的理解,对项目开发将大有禆益。
在我当前任职的公司里,有这样一道面试题,关于数组排序的。简化和提炼一下,题目是:
请按以下规则,对专辑的歌曲进行排序。 1、按播放次数,从高到低排序。 2、如果播放次数相同,则按收藏人数从高到低排序。 3、如果收藏人数相同,则按下载次数从高到低排序。
并假设有专辑歌曲列表如下:
表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(),更多其他的排序函数就记不住,或者没有印象了。下面将分享如何快速记住这些排序函数的技巧。
从官方文档摘录的,对数组排序的函数有:
全部列出来,有13个之多。那怎么记得住呢?其实,在理科里,都是有技巧的,要靠理解,而非死记硬背。就像数学公式一样,要活学活用。
我们都知道,PHP数组由键和值组成,而排序顺序可以是升序,或者是降序。根据这两个维度,我们可以将上面13个排序函数进行分类。首先分为两大类:对值排序,和对键排序。如下面表格所示。
表4-2 数组排序函数
升序
降序
自定义
自然排序
其他
对值排序
sort()、asort()
rsort()、arsort()
usort()、uasort()
natsort()、natcasesort()
shuffle()、array_multisort()
对键排序
ksort()
krsort()
uksort()
对这样的分类清晰后,接着下再来看怎么记住这结函数名称。可以发现,除了随机排序函数的名称为shuffle()外,其他全部排序函数都是以“sort()”结尾的。
不难发现,函数名称中的这些字母表示的意思分别是:
然后,再从最原始的sort()函数开始,若加上首字母a则表示保持索引关系的排序,若加上首字母k则表示对键排序。由此构成第一梯度排序函数:
这三个排序函数,若全部在“sort”前加上字母r,则表示降序排序。从而构成第二梯度排序函数:
如果在第一梯度的三个排序函数最前面加上首字母u,则更简单了。直接表示用户自定义排序系列的函数,即第三梯度排序函数:
最后,剩下的4个函数排序可归为第四梯度排序函数,即综合型的排序,有:
通过这样的整理,估计你能在更短的时间内,对PHP的数组排序函数有更深刻的理解。甚至乎,可以逐渐明白设计PHP这门语言当时的初衷是多么的巧妙。
以上内容就是为大家推荐的php数组排序方法(一览php数组排序应用攻略)最佳回答,如果还想搜索其他问题,请收藏本网站或点击搜索更多问题
内容来源于网络仅供参考版权声明:所有来源标注为小樱知识网www.cnfyy.com的内容版权均为本站所有,若您需要引用、转载,只需要注明来源及原文链接即可。
本文标题:php数组排序方法(一览php数组排序应用攻略)
本文地址:https://www.cnfyy.com/shcs/122712.html
相关文章
手机排序怎么排序的,买手机的核心指标是什么? 很多人都关注一部手机都会在乎手机的cpu有多强,手机摄像头像素有多高,但这些参数,在我看来,这些...
2023-04-18
手机排序怎么排序,电话号码按什么顺序排列? 兄弟,不知道你所说的顺序是怎么一回事,因为在排序方面有很多种说法,下面有一种算法,参照一下 先...
2023-04-18
手机微博怎么按时间排序,绿洲和微博的区别? 1.在内容推荐中: 绿洲是以时间线排序的信息机制。 微博是以热度排序的信息流机制。 2.从平台使用上来...
2023-03-28
苹果手机排序怎么弄,苹果手机发展顺序排列? 1、第一代iPhone于2007年1月9日由苹果公司前首席执行官史蒂夫·乔布斯发布,并在2007年6月29日正式发售; ...
2023-03-26
手机wps表格怎么排序,手机word怎么自动编号? 选择序号列的空白单元格——开始(HOME)——点击编辑向下箭头——点击定义新编号格式。接着在编号格式...
2023-03-20
热点文章
2021年独生子女补贴新政策是真的吗(独生子女证有有效期吗)
2021年国庆节阅兵仪式几点开始几点结束(2021年国庆节还有阅兵吗)
鼠目寸光一点红是什么生肖动物(鼠目寸光一点红)指什么生肖,紧密
k0到k9的玩法大全(强制gc的玩法和注意事项)
入土为安是什么生肖《入土为安》打一个生肖动物,词语解释
浙江12月底全面停工是真的吗(浙江什么时候放假停工)
如何做t(t怎么把p做哭)
北京口碑最差的三甲医院(北京301医院最擅长什么)