在编写PHP代码之际,数组进行排序差不多是每一个项目都会碰到过的情形。然而,好多新手乃至具备一定经验的开发者,经常于此处遭遇“危机”。好多人径直拿sort函数去排关联数组,最终键名丢失了;或者在依据某个字段对用户数据排序时,排出来的顺序杂乱无章。实际上,只要弄清楚几个核心函数的差异,数组排序并非那么困难。
sort、asort、ksort 区别在哪
这是一组极具基础性同时又极易招致混淆的函数,简要来讲,究竟选用哪一个函数,全然取决于你“意欲如何进行排列”以及“是否对键名予以在意”。sort函数适用于结构简易的索引数组,举例而言,倘若你拥有一个全然由数字构成的列表 [5, 3, 8],运用它来实现升序排列实在是最为便利不过的了。然而它具备一个特性:在完成排序操作之后会对键名予以重置,原本的键就此消失不见了。
要是你的数组属于关联类型,就像 ['a' => 5, 'b' => 3] 这样,同时期望的是排序之后还依然能够借助原来已然存在的键(也就是 ‘a’、’b’)去访问与之对应的具体的值,在此情形下那就绝对得采用 asort(这种方式是按值进行排序)或者 ksort(此方式是按键进行排序)才行。这两种方式都会完完全全地留存住键值之间原本所对应的那种关系。前不久,帮一位友人排查程序漏洞,他仅仅是运用了 sort 对一组配置数组进行排序操作,然而键值对却全然混乱无序,致使程序读取到了错误的配置数据,这无疑是典型的函数使用错误的情形。
怎么按数组内某个字段排序
从事实际业务期间,我们所面对的常常是更为繁杂的数据,像是从数据库之中查询得出的用户列表,此列表需要依据年龄、薪水或者注册时间来进行排序。在这种情形下,sort 家族的函数便毫无办法了,必须要请出 usort 函数。
`usort` 能让你自行设定比较的规则,比如说要是打算依据用户的 `age` 字段按照升序来进行排列,那么你能够像这样去写:`usort($users, ($a, $b) { $a[‘age’] $b[‘age’]; });`。这里的 ,乃是在 PHP 7 时被引入的“太空船操作符”啰 ,其于前者小于、等于或者大于后者之际呢 ,会分别传回 -1、0、1 哟 ,显得极为简洁且安全哒。昨天之时哦 ,我瞅见了一个技术社区的讨论呀 ,有人于处理从外部 API 那儿获取到的赛事数据之时噢 ,得借助 usort 依照比赛时间先后顺序来排序呢 ,随后再渲染至页面上去呀哦 ,这便是一个极为典型的应用喽。
多维数组排序后丢失结构
排序需求变得愈发复杂之际,比如说先行依照用户的年龄予以排序,年龄一致的情况下再按照名字的字母顺序进行排序,此时,usort尽管也能够达成(于比较函数之中撰写多层判断),然而代码会趋于臃肿起来。却是特别针对这种“多列排序”的得力工具。
然而,此函数在运用时相当容易出现错误的情况,众多初涉者直接传入一个多维数组,随后却发觉排序并未产生任何效果,甚至产生报错现象,但那正确的操作方式应该是,首先利用 将需要进行排序的列,诸如年龄、名字这类,提取出来从而形成一维数组,之后再把这些呈现为一维数组的内容作为参数传递给 ,具体就如同这个样子:
$ages = ($users, 'age');
$names = ($users, 'name');
($ages, , $names, , $users);
如此这般去开展操作,主数组$users便会首先依据年龄以升序的方式进行排列,要是年龄出现相同的情况,接着就会按照名字以升序的形式继续排列,而且全然保证整个数据结构维持完好无损的状态。
中文字符串排序乱码
这是一个在项目上线前夕极易突然浮现的问题,直接运用 sort 或者 asort 对含有中文的数组排序,所获取的结果常常与预期不符,例如“李”被排列在了“王”的前面,造成此现象的缘由是 PHP 默认的字符串排序是依循当前的字节顺序进行的,其并不“知晓”中文拼音或者笔画。
处理此问题,较为值得进行推荐的一类方式,乃是运用PHP的intl扩展之内的类。你能够设定一个区域(举例来说像zh_CN),它会依据该语言的习惯去开展排序。
$coll = new ('zh_CN');
$coll->asort($);
假若服务器环境没法支持此项扩展,有一种备选方案是,首先把中文转换为拼音,接着针对拼音展开排序,然而这要引入额外的库,并且也会增添一些开销。
试问于实际开发期间,可曾有这样的状况:因排序函数使用有误,进而致使了有着“诡异”之感的Bug出现?诚挚欢迎于评论区域分享你的“踩坑”经历哟,要是觉得此篇文章具备实用价值,可千万别忘记点赞并分享给更多的小伙伴呀!




发表回复