PHP如何按数组键的第3个字符开始进行排序?
PHP关联数组按键的指定子串排序
问题场景
现有如下PHP关联数组:
$arr = [ 'D.Fletcher' => [ 'games' => 2, 'ab' => 6, 'runs' => 2, 'hits' => 2 ], 'A.Slegers' => [ 'games' => 3, 'ab' => 0, 'runs' => 0, 'hits' => 0 ], 'A.Eaton' => [ 'games' => 1, 'ab' => 2, 'runs' => 0, 'hits' => 0 ], 'S.Ohtani' => [ 'games' => 3, 'ab' => 6, 'runs' => 2, 'hits' => 3 ] ];
需要按数组键的第3个字符开始的子串排序。直接用ksort()得到的结果是:
A.Eaton A.Slegers D.Fletcher S.Ohtani
但期望的排序结果(对应SQL语句SELECT * FROM batters ORDER BY SUBSTRING(name, 3)的效果)是:
A.Eaton D.Fletcher S.Ohtani A.Slegers
实现方案
使用PHP的uksort()函数,它支持自定义数组键的比较规则,完美匹配需求:
// 自定义键排序逻辑 uksort($arr, function($key1, $key2) { // 截取键的第3个字符开始的子串(PHP字符串索引从0开始,第3个字符对应索引2) $subKey1 = substr($key1, 2); $subKey2 = substr($key2, 2); // 按子串的字典序比较 return strcmp($subKey1, $subKey2); }); // 验证排序结果 foreach ($arr as $key => $_) { echo $key . PHP_EOL; }
代码说明
uksort():专门用于关联数组的键排序,回调函数负责定义两个键的比较规则substr($key, 2):截取从第3个字符开始的子串(索引2对应第3个字符)strcmp():比较两个字符串的字典序,返回值用于告诉uksort()两个键的大小关系
执行上述代码后,输出的键顺序与预期完全一致。
内容的提问来源于stack exchange,提问作者user2140857
相关产品推荐
相关产品推荐

