PHP 购物车按商品类别分组统计数量教程

本文介绍如何从 php session 中读取购物车数组,按数据库中的数字类别(如 1、2、3)分组汇总商品数量,适用于运费计算等业务场景。

在基于 Session 实现的 PHP 购物车中,$_SESSION["cart_item"] 通常以商品编码(code)为键、商品信息为值的关联数组形式存储。但默认结构不便于按类别(category)聚合统计——而运费策略往往依赖“每类商品总件数”或“是否含某类商品”。下面提供清晰、健壮、可直接集成的解决方案。

✅ 步骤一:提取并按 category 分组统计

在需要计算分类数量的位置(例如结算页、运费预估逻辑中),使用以下代码遍历购物车,构建 category => total_quantity 的映射:

// 初始化空数组用于按类别累加
$categoryCounts = [];

// 遍历购物车中的每个商品项
if (!empty($_SESSION["cart_item"])) {
    foreach ($_SESSION["cart_item"] as $item) {
        $category = (int)$item["category"]; // 强制转为整型,避免字符串键歧义
        $quantity = (int)$item["quantity"];

        if (!isset($categoryCounts[$category])) {
            $categoryCounts[$category] = 0;
        }
        $categoryCounts[$category] += $quantity;
    }
}

// $categoryCounts 现在形如:[1 => 3, 2 => 5, 4 => 1]

✅ 步骤二:实际应用示例(如运费判断)

假设类别 1 代表“标准商品”,2 代表“易碎品”(需额外包装费),3 代表“冷链商品”(需保温运费):

$shippingFee = 0;

if (!empty($categoryCounts)) {
    if (isset($categoryCounts[2]) && $categoryCounts[2] > 0) {
        $shippingFee += 8.00; // 易碎品附加费
    }
    if (isset($categoryCounts[3]) && $categoryCounts[3] > 0) {
        $shippingFee += 15.00; // 冷链附加费
    }
    // 基础运费(按总件数)
    $totalItems = array_sum($categoryCounts);
    $shippingFee += max(5.00, $totalItems * 1.20); // 阶梯计费示例
}

⚠️ 注意事项与最佳实践

  • 数据类型安全:始终对 $item["category"] 和 $item["quantity"] 进行 (int) 类型转换,防止因字符串 '1' 与 1 混淆导致分组失败;
  • 空值防御:检查 $_SESSION["cart_item"] 是否存在且非空,避免 foreach 报错;
  • Session 一致性:确保购物车增删逻辑(如你提供的 add/remove 操作)未意外破坏 category 字段——建议在 DBController::runQuery() 返回后立即校验:
    if (empty($productByCode[0]["category"])) {
        throw new Exception("Product {$code} missing category field");
    }
  • 扩展性提示:若未来需支持多维统计(如「类别 × 重量」),建议将 $categoryCounts 升级为嵌套结构或改用 array_reduce() 函数式写法,提升可维护性。

该方法简洁高效,无需重构现有购物车存储结构,即可快速支撑基于类别的业务逻辑,是中小型 PHP 电商项目的推荐实践。