如何将数据库表中的行转换为多维分层 struct 以计算唯一库存项目?

我的数据库如下所示:

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']
]

我想从modelstoragecolor值创建一个父子 struct 化数组,其中最低级别包含具有该特定值组合的项目总数.

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

我try 使用带有太多foreach条语句的嵌套循环,但根本不起作用. 我想我错误地使用了array_push()方法,因为我从来没有得到正确的结果

推荐答案

假设定义因子(如modelstoragecolor)是数据库中的列,则可以创建如下所示的简单函数

function generateProductArray($database) {
    $result = array();

    foreach ($database as $entry) {
        $model = $entry['model'];
        $storage = $entry['storage'];
        $color = $entry['color'];

        if (!isset($result[$model])) {
            $result[$model] = array();
        }

        if (!isset($result[$model][$storage])) {
            $result[$model][$storage] = array();
        }

        if (!isset($result[$model][$storage][$color])) {
            $result[$model][$storage][$color] = 0;
        }

        $result[$model][$storage][$color]++;
    }

    return $result;
}

您还可以使用内置的PHP函数(如array_reduce( ))简化功能/代码:

function generateProductArray($database) {
    return array_reduce($database, function ($result, $entry) {
        [$model, $storage, $color] = array_values($entry);

        $result[$model][$storage][$color] = ($result[$model][$storage][$color] ?? 0) + 1;

        return $result;
    }, []);
}

其提供所需的输出.

Array
(
    [iPhone 14 Pro] => Array
        (
            [128gb] => Array
                (
                    [Black] => 2
                )

            [256gb] => Array
                (
                    [Blue] => 1
                    [Red] => 2
                )

        )

)

Example

Php相关问答推荐

Postgrid Webhook不叫laravel

LaravelEloquent 的地方条件父/子与第三模型多对多

使用PHP curl的Amazon SP API批处理调用

在PHP中,如何将介于0和1之间(包括0和1)的浮点概率转换为数组索引?

如何不重新查询模型A-&>;相关模型B-&>模型

在WooCommerce上克隆订单时使用`add_product()`添加产品元数据

Codeigniter 4中的未定义变量$HOME

Symfony Validator:如何使用XML表示法验证深度嵌套的数据?

用GUZLE模拟Read_Timeout

如何在 Laravel 中app文件夹之外的文件夹内创建文件路径?

通过添加计数器修改文本区域表单中的重复值

PHP 中的 libgd 无法读取 Apache 配置中的 SetEnv GDFONTPATH

如何将文件上传添加到 WooCommerce 结帐?

Laravel 路由参数中的 ":" 是什么?

WooCommerce checkout 流程中基于所选选项添加自定义费用

PHP:如何将多列sql查询结果转换成数组

ACF 更新字段功能不更新 WordPress 中的任何数据

Laravel auth()->id() 在生产服务器中不工作

使用 GROUP_CONCAT 规范化/转置来自查询的数据

图像不会显示在生产中的 Laravel 应用程序中