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

如何将数据库表行转换为多维层级结构统计库存商品数量?

数据库行转多维层级结构统计库存数量

我需要将数据库表的行转换为多维层级结构,以统计唯一库存商品的数量。

数据库结构

CREATE TABLE stock (
    model VARCHAR(100),
    storage VARCHAR(100),
    color VARCHAR(100)
);

INSERT INTO stock VALUES
('iPhone 14 Pro', '128gb', 'Black'),
('iPhone 14 Pro', '256gb', 'Red'),
('iPhone 14 Pro', '128gb', 'Black'),
('iPhone 14 Pro', '256gb', 'Black'),
('iPhone 14 Pro', '256gb', 'Red'),
('iPhone 14 Pro', '128gb', 'White'),
('iPhone 13 Pro', '128gb', 'Black'),
('iPhone 14 Pro', '256gb', 'Red');

查询结果集

[
    ['model' => 'iPhone 14 Pro', 'storage' => '128gb', 'color' => 'Black'],
    ['model' => 'iPhone 14 Pro', 'storage' => '256gb', 'color' => 'Red'],
    ['model' => 'iPhone 14 Pro', 'storage' => '128gb', 'color' => 'Black'],
    ['model' => 'iPhone 14 Pro', 'storage' => '256gb', 'color' => 'Black'],
    ['model' => 'iPhone 14 Pro', 'storage' => '256gb', 'color' => 'Red'],
    ['model' => 'iPhone 14 Pro', 'storage' => '128gb', 'color' => 'White'],
    ['model' => 'iPhone 13 Pro', 'storage' => '128gb', 'color' => 'Black'],
    ['model' => 'iPhone 14 Pro', 'storage' => '256gb', 'color' => 'Red']
]

目标结构

希望基于model、storage和color值创建父子结构数组,最底层为该组合的商品总数:

[
    'iPhone 14 Pro' => [
        '128gb' => [
            'Black' => 2,
            'White' => 1,
        ],
        '256gb' => [
            'Red' => 3,
            'Black' => 1,
        ],
    ],
    'iPhone 13 Pro' => [
        '128gb' => [
            'Black' => 1,
        ],
    ],
]

我尝试使用嵌套foreach循环但完全无效,推测是错误使用了array_push()方法,始终无法得到正确结果。


解决方案

方法一:先SQL分组统计,再构建层级

先通过SQL直接统计每个组合的数量,再用PHP构建数组,效率更高:

SELECT model, storage, color, COUNT(*) AS count
FROM stock
GROUP BY model, storage, color
ORDER BY model, storage, color;

PHP处理查询结果:

// 假设$dbResult是SQL查询返回的结果集
$stockHierarchy = [];

foreach ($dbResult as $item) {
    $model = $item['model'];
    $storage = $item['storage'];
    $color = $item['color'];
    $count = $item['count'];

    // 逐层初始化数组(不存在则创建)
    if (!isset($stockHierarchy[$model])) {
        $stockHierarchy[$model] = [];
    }
    if (!isset($stockHierarchy[$model][$storage])) {
        $stockHierarchy[$model][$storage] = [];
    }

    // 赋值统计数量
    $stockHierarchy[$model][$storage][$color] = $count;
}

print_r($stockHierarchy);

方法二:直接处理原始重复行结果

如果必须处理原始的重复行数据,直接遍历累加计数:

// $rawData是原始查询结果数组
$stockHierarchy = [];

foreach ($rawData as $item) {
    $model = $item['model'];
    $storage = $item['storage'];
    $color = $item['color'];

    // 逐层检查并初始化层级
    if (!isset($stockHierarchy[$model])) {
        $stockHierarchy[$model] = [];
    }
    if (!isset($stockHierarchy[$model][$storage])) {
        $stockHierarchy[$model][$storage] = [];
    }
    if (!isset($stockHierarchy[$model][$storage][$color])) {
        $stockHierarchy[$model][$storage][$color] = 0;
    }

    // 累加当前组合的数量
    $stockHierarchy[$model][$storage][$color]++;
}

print_r($stockHierarchy);

关键注意点

  • 不需要使用array_push(),因为我们是通过关联数组的键来构建层级,而非往数组末尾追加元素。
  • 核心逻辑是逐层检查每个层级的键是否存在,不存在则初始化空数组,最后对最底层的颜色计数进行累加或赋值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 00:07:03