您现在的位置是:群英 > 开发技术 > PHP语言
PHP项目中数组排序有哪些应用及使用技巧
Admin发表于 2022-06-18 17:04:46550 次浏览
今天就跟大家聊聊有关“PHP项目中数组排序有哪些应用及使用技巧”的内容,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。


4.2 数组排序

php里的数组实际上是一个有序映射。不管是队列、数组、栈还是字典,在使用php编程时,你都可以统一使用php的数组类型。这一节,我们只探讨关于php数组的排序,因为数组的排序是很多项目都会使用到的。虽然数据库也可以很方便进行排序,但在复杂、动态的业务规则下,更多需要在php代码层进行处理。因此加深对php数组的理解,对项目开发将大有禆益。

4.2.1 一道面试题引发的思考

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

请按以下规则,对专辑的歌曲进行排序。
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(),更多其他的排序函数就记不住,或者没有印象了。下面将分享如何快速记住这些排序函数的技巧。

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

  • 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这门语言当时的初衷是多么的巧妙。


以上就是关于PHP项目中数组排序有哪些应用及使用技巧的介绍,本文内容仅供参考,有需要的朋友可以借鉴了解看看,希望对大家学习或工作,想要了解更多欢迎关注群英网络,小编每天都会为大家更新不同的知识。

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

标签: 数组排序php
相关信息推荐
2022-09-24 17:27:43 
摘要:在本篇文章里小编给大家整理了一篇关于php访问对象中的成员的实例方法,有需要的朋友们可以跟着学习参考下。
2022-04-27 17:46:43 
摘要:这篇文章主要介绍了C++ 函数指针内容,下面文章围绕C++ 函数指针的相关资料展开详细内容,包括函数指针的进阶内容,需要的朋友可以参考一下,希望对大家有所帮助
2022-05-11 14:44:37 
摘要:jquery migrate是一个应用迁移辅助插件,是用于高级版本兼容低级版本的辅助插件;该插件能够解决jquery升级后新旧代码不兼容的问题,简单来说就是把不支持的函数再写出来支持一下。
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部