PHP多维数组按quantity正负排序后再按nbr_sales降序排列问题
你现有代码存在两个核心问题:
- 分组逻辑错误:仅拆分了
quantity>0的正数组,剩余的0和负数都被归入了同一分组,导致两类数据混排 - 数组合并错误:使用
array_push添加分组数组,会把分组整体作为单个元素存入结果,最终得到嵌套的二维数组,而非你需要的一维排序结果
方案1:调整原有分组合并逻辑
把原来的2组拆分为正数、零、负数3组分别处理,再按顺序合并:
$result = array(); $positives = array(); $zeros = array(); $negatives = array(); // 按quantity值分三组 foreach($test as $t) { if ($t['quantity'] > 0) { $positives[] = $t; } elseif ($t['quantity'] == 0) { $zeros[] = $t; } else { $negatives[] = $t; } } // 各组按nbr_sales降序排序 $sortCallback = function($a, $b){ return $a['nbr_sales'] == $b['nbr_sales'] ? 0 : ($a['nbr_sales'] < $b['nbr_sales'] ? 1 : -1); }; usort($positives, $sortCallback); usort($zeros, $sortCallback); usort($negatives, $sortCallback); // 按顺序合并三个一维数组得到结果 $result = array_merge($positives, $zeros, $negatives);
方案2:直接单次排序实现(更简洁)
无需拆分分组,直接在usort的回调函数中实现排序规则即可:
usort($test, function($a, $b) { // 先按quantity分组权重排序:正数权重2>0权重1>负数权重0 $aGroup = $a['quantity'] > 0 ? 2 : ($a['quantity'] == 0 ? 1 : 0); $bGroup = $b['quantity'] > 0 ? 2 : ($b['quantity'] == 0 ? 1 : 0); if ($aGroup != $bGroup) { return $bGroup - $aGroup; // 权重高的排前面 } // 同组按nbr_sales降序 return $a['nbr_sales'] == $b['nbr_sales'] ? 0 : ($a['nbr_sales'] < $b['nbr_sales'] ? 1 : -1); }); // 排序后的$test就是你需要的结果
如果使用PHP7及以上版本,还可以用太空船运算符<=>简化判断逻辑,代码会更精简。
内容的提问来源于stack exchange,提问作者aurepito
相关产品推荐
相关产品推荐

