PHP中如何按name字段对含字符串值的多维数组正确排序
PHP按name字段自然排序嵌套数组
现有结构
待排序的数组结构如下:
array ( 0 => array ( 'id' => 'a11', 'name' => 'A-11', 'state' => 1, 'cage' => array ( 'id' => 'sub-a-11', 'name' => 'Cage A', ), ), 1 => array ( 'id' => 'a9', 'name' => 'A-9', 'state' => 1, 'cage' => array ( 'id' => 'sub-a-9', 'nama' => 'Cage A', ), ), 2 => array ( 'id' => 'a10', 'name' => 'A-10', 'state' => 1, 'cage' => array ( 'id' => 'sub-a-10', 'name' => 'Cage A', ), ), )
预期排序结果
按name字段排序后顺序为:
A-9 A-10 A-11
原有代码问题
你写的排序代码无法得到正确结果,原因有两个:
- 排序规则错误:默认的
SORT_ASC是逐字符比较字符串,A-10的第三个字符是1,ASCII码小于A-9的第三个字符9,会把A-10排在A-9前面,不符合带数字后缀字符串的排序逻辑,需要用自然排序规则。 - 操作对象错误:你两次调用
$myData->toArray()会生成两个独立的数组副本,array_multisort排序的是第二个临时生成的副本,排序结果没有保存,最后返回的$myData还是原顺序。
正确实现方案
方案1:修正array_multisort参数
// 只调用一次toArray,把数组存到变量 $arr = $myData->toArray(); $sortKeys = array_column($arr, 'name'); // 增加SORT_NATURAL标志启用自然排序 array_multisort($sortKeys, SORT_ASC, SORT_NATURAL, $arr); // 如果你用的是Laravel Collection类,返回排序后的新集合即可 return collect($arr); // 如果是普通数组操作,直接返回$arr
方案2:用usort搭配自然排序比较函数
$arr = $myData->toArray(); usort($arr, function($prev, $next) { // 调用PHP内置自然排序比较函数 return strnatcmp($prev['name'], $next['name']); }); // 后续返回逻辑和方案1一致
方案3:如果$myData是Laravel集合,直接调用集合方法
// 直接调用sortBy,传入自然排序标志,最后用values重置索引 return $myData->sortBy('name', SORT_NATURAL)->values();
内容的提问来源于stack exchange,提问作者Catto
相关产品推荐
相关产品推荐

