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

PHP多维数组按quantity正负排序后再按nbr_sales降序排列问题

你现有代码存在两个核心问题:

  1. 分组逻辑错误:仅拆分了quantity>0的正数组,剩余的0和负数都被归入了同一分组,导致两类数据混排
  2. 数组合并错误:使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 11:45:08