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(即字段值相等)时,才会执行后面的比较逻辑,完美贴合优先级排序需求。
验证结果
执行上述代码后,数组会严格按照你预期的规则升序排序:
- 优先按
grand_total升序排列,729.81的项排在746.03前面 grand_total相等的项,按lowest_order_date升序排列(空字符串会排在非空日期前面,符合字符串排序规则)- 前两个字段都相等时,按
lowest_created_at升序排列
最终结果与你给出的预期输出完全一致。
内容的提问来源于stack exchange,提问作者Linesofcode
相关产品推荐
相关产品推荐

