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

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

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]的值,不知道这样的描述是否理解。求助大神帮忙解决一下。

阅读 6.1k
2 个回答

首先要指责一下,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那边默认使用最后一个元素,应该可以满足你提的需求。你可以根据实际需求

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题