PHP如何对数组按元素值的最后一个字符排序
PHP 按数组元素值最后一个字符排序的实现方案
需求说明
给定一组字符串数组,需要按照每个元素字符串的最后一个字符的字典序完成排序,同时排序完成后数组的数字索引从0开始重新连续分配,不保留原有索引。
原始示例数组:
$string[0] = "They"; $string[1] = "started"; $string[2] = "plotting"; $string[3] = "against"; $string[4] = "him";
期望达成的排序效果:
$string[0] = "started"; $string[1] = "plotting"; $string[2] = "him"; $string[3] = "against"; $string[4] = "They";
实现代码
直接使用PHP内置的usort函数做自定义排序即可,这个函数的内置特性就是排序完成后会自动重置数组的数字索引,刚好匹配索引重写的要求。
排序的回调逻辑非常简单:提取两个待比较元素的最后一个字符,直接对两个字符做大小比对即可。
完整可运行的代码:
$string = [ "They", "started", "plotting", "against", "him" ]; usort($string, function ($a, $b) { // 提取每个字符串的最后一个字符 $lastCharA = substr($a, -1); $lastCharB = substr($b, -1); // 按字符字典序返回比较结果 return $lastCharA <=> $lastCharB; }); // 打印输出排序后的数组 print_r($string);
效果校验
对照每个元素的最后一个字符的字典顺序,就能验证逻辑的正确性:
started最后一位字符是dplotting最后一位字符是ghim最后一位字符是magainst最后一位字符是tThey最后一位字符是y
字符顺序 d < g < m < t < y,和示例给出的期望结果完全一致。
实操注意点
- 不要用
uasort实现这个需求:该函数排序时会保留原数组的键值,无法实现索引重写的效果。 - 代码里使用的太空船操作符
<=>是PHP7.0及以上版本支持的语法,如果是更低版本的PHP环境,把比较部分替换为strcmp($lastCharA, $lastCharB)就能实现完全相同的效果。 - 如果处理包含中文、特殊符号的多字节字符串,需要把
substr替换为mb_substr并指定对应字符编码,避免截取最后字符时出现乱码,示例写法:$lastCharA = mb_substr($a, -1, 1, 'UTF-8'); $lastCharB = mb_substr($b, -1, 1, 'UTF-8'); - 如果需要做反向排序,只需要在回调里把两个比较值的位置调换即可。
内容的提问来源于stack exchange,提问作者Shalu Awzme
相关产品推荐
相关产品推荐

