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

PHP多维数组按指定列优先级排序问题求助

PHP多维数组按多字段优先级排序问题解决

问题分析

原代码的错误在于将多个太空船运算符的结果相加,这会彻底破坏排序优先级。太空船运算符返回-1/0/1,相加后可能抵消主条件的差异(比如主条件返回-1,次要条件返回1,总和为0,会被判定为两者相等),导致排序逻辑完全偏离预期。

正确实现方式

要实现「主优先级字段不相等时直接按该字段排序,相等时才判断下一个字段」的逻辑,需要依次判断每个条件,仅当前面的条件相等时才进入下一个条件的比较。

写法1:传统匿名函数(兼容PHP 5.3+)

usort($data, function ($a, $b) {
    // 先比较grand_total,优先级最高
    $totalCompare = $a['totals']['grand_total'] <=> $b['totals']['grand_total'];
    if ($totalCompare !== 0) {
        return $totalCompare;
    }
    // grand_total相等时,比较lowest_order_date
    $dateCompare = $a['totals']['lowest_order_date'] <=> $b['totals']['lowest_order_date'];
    if ($dateCompare !== 0) {
        return $dateCompare;
    }
    // 前两个都相等时,比较lowest_created_at
    return $a['totals']['lowest_created_at'] <=> $b['totals']['lowest_created_at'];
});

写法2:箭头函数(PHP 7.4+,更简洁)

usort($data, fn($a, $b) => 
    $a['totals']['grand_total'] <=> $b['totals']['grand_total'] ?:
    $a['totals']['lowest_order_date'] <=> $b['totals']['lowest_order_date'] ?:
    $a['totals']['lowest_created_at'] <=> $b['totals']['lowest_created_at']
);

这里利用PHP的?:短路运算符:如果前面的比较结果不为0,就直接返回该结果;只有当结果为0(即字段值相等)时,才会执行后面的比较逻辑,完美贴合优先级排序需求。

验证结果

执行上述代码后,数组会严格按照你预期的规则升序排序:

  1. 优先按grand_total升序排列,729.81的项排在746.03前面
  2. grand_total相等的项,按lowest_order_date升序排列(空字符串会排在非空日期前面,符合字符串排序规则)
  3. 前两个字段都相等时,按lowest_created_at升序排列

最终结果与你给出的预期输出完全一致。

内容的提问来源于stack exchange,提问作者Linesofcode

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:30:51