php求助如何将二维数组变成一维数组?

发布于 2022-09-07 12:45:37 字数 3100 浏览 16 评论 0

现在有一个二维数组格式如下:

Array
(
    [0] => Array
        (
            [id] => 38
            [goods_id] => 77426
            [model_name] => 颜色
            [model_sub_name] => Array
                (
                    [0] => 黑色
                    [1] => 白色
                    [2] => 红色
                    [3] => 浅蓝色
                    [4] => 紫色
                )

            [goods_stock] => Array
                (
                    [0] => 321
                )

            [curr_price] => Array
                (
                    [0] => 99
                )

            [goods_weight] => Array
                (
                    [0] => 280
                )

        )

    [1] => Array
        (
            [id] => 39
            [goods_id] => 77426
            [model_name] => 尺码
            [model_sub_name] => Array
                (
                    [0] => 32A
                    [1] => 34A
                    [2] => 36A
                    [3] => 32B
                    [4] => 34B
                    [5] => 36B
                    [6] => 38B
                    [7] => 34C
                    [8] => 36C
                    [9] => 38C
                    [10] => 40C
                    [11] => 
                )

            [goods_stock] => Array
                (
                    [0] => 321
                )

            [curr_price] => Array
                (
                    [0] => 99
                )

            [goods_weight] => Array
                (
                    [0] => 280
                )

        )

)

现在需要将这个二维数组变成如下格式:

Array
(
    [0] => Array
        (
            [model_name] => 颜色
            [model_sub_name] => 黑色
            [goods_stock] => 321
            [curr_price] => 99
            [goods_weight] => 280

        )
    [1] => Array
        (
            [model_name] => 颜色
            [model_sub_name] => 白色
            [goods_stock] => 321
            [curr_price] => 99
            [goods_weight] => 280

        )
        ……这里省略N个数组

    [N+1] => Array
        (
            [model_name] => 尺码
            [model_sub_name] => 32A
            [goods_stock] => 321
            [curr_price] => 99
            [goods_weight] => 280
               
        )
    [N+2] => Array
        (
            [model_name] => 尺码
            [model_sub_name] => 34A
            [goods_stock] => 321
            [curr_price] => 99
            [goods_weight] => 280
               
        )
    这里也省略总数组第二个元素的几条记录
)

在上述数组中goods_stock、curr_price、goods_weight都是数组,如果这几个键中的数组只有一个元素,那么在model_name一样的前提下,goods_stock、curr_price、goods_weight都取这一个值,否则,就取model_sub_name中元素下标对应的goods_stock、curr_price、goods_weight中的值。比如model_sub_name为“白色”时对应的下标是1,上述数组中goods_stock、curr_price、goods_weight都只有一个元素,那么就取这一个元素的值,如果不是一个元素,则取goods_stock[1]、curr_price[1]、goods_weight[1]的值,不知道这样的描述是否理解。求助大神帮忙解决一下。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

空宴 2022-09-14 12:45:37

首先要指责一下,print_r的输出贴出来,怎么还原为数组代码,demo都写不了,要死啦。

$arr = ['a', 'b', 'hello' => '原罪'];

var_export($arr);

// 返回值:可以直接还原为代码
array (
  0 => 'a',
  1 => 'b',
  'hello' => '原罪',
);

这个用reduce比较合适

$result = array_reduce($arr, function ($carry, $item) {
    $extraProperties = ['goods_stock', 'curr_price', 'goods_weight'];

    // 先计算下标数量,提高效率
    $lengths = [];
    foreach ($extraProperties as $property) {
        $lengths[$property] = count($item[$property]) - 1;
    }

    // 开始收集
    foreach ($item['model_sub_name'] as $index => $subName) {
        $sub = [
            'model_name' => $item['model_name'],
            'model_sub_name' => $subName,
        ];
        
        foreach ($extraProperties as $property) {
            $propertyIndex = min($index, $lengths[$property]);
            $sub[$property] = $item[$property][$propertyIndex];
        }
       
        $carry[] = $sub;
    }

    return $carry;
}, []);

其中$propertyIndex那边默认使用最后一个元素,应该可以满足你提的需求。你可以根据实际需求

亢潮 2022-09-14 12:45:37

需要先设置一个空数组,然后两层循环,第一层循环大数组,第二层循环里面的model_sub_name,然后给空数组赋值就行了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文