You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 09:03:34