鍍金池/ 問答/PHP/ php把一個數(shù)組生成特定格式數(shù)組的問題

php把一個數(shù)組生成特定格式數(shù)組的問題

有一個數(shù)組,格式如下:

$input = [
    ['vid' => 1, 'v_name' => 'v1', 'prop' => ['pid' => 1, 'p_name' => '顏色']],
    ['vid' => 2, 'v_name' => 'v2', 'prop' => ['pid' => 1, 'p_name' => '顏色']],
    ['vid' => 3, 'v_name' => 'v3', 'prop' => ['pid' => 2, 'p_name' => '形狀']],
];

現(xiàn)在我要將它以如下的格式返回:

$output = [
            [
            'pid' => 1,
            'p_name' => '顏色',
            'p_v_list' => [
                [
                    'vid' => 1,
                    'v_name' => 'v1'
                ],
                [
                    'vid' => 2,
                    'v_name' => 'v2'
                ],
            ]
        ],
        [
            'pid' => 2,
            'p_name' => '形狀',
            'p_v_list' => [
                [
                    'vid' => 3,
                    'v_name' => 'v3'
                ]
            ]
        ]
    ];

我使用foreach進(jìn)行拼接:

$output = [];
foreach ($input as $item) {
    $pid = $item['prop']['pid'];
    if (!array_key_exists($pid, $output)) {
        $output[$pid] = $item['prop'];
    }
    $output[$pid]['p_v_list'][] = ['vid' => $item['vid'], 'v_name' => $item['v_name']];
}
$output = array_chunk($output, count($output))[0];

現(xiàn)在我覺得這種方法不是很好,但一時想不出如何更好地生成,所以想請問下各位有好的方法嗎?

thanks!
回答
編輯回答
巴扎嘿

好像差不多,哈哈


<?php

$input = [
    ['vid' => 1, 'v_name' => 'v1', 'prop' => ['pid' => 1, 'p_name' => '顏色']],
    ['vid' => 2, 'v_name' => 'v2', 'prop' => ['pid' => 1, 'p_name' => '顏色']],
    ['vid' => 3, 'v_name' => 'v3', 'prop' => ['pid' => 2, 'p_name' => '形狀']],
];

$result = array_map(function ($item) {
    $item = array_merge($item['prop'], [
        'p_v_list' => [
            [
                'vid' => $item['vid'],
                'v_name' => $item['v_name'],
            ],
        ],
    ]);
    return $item;;
}, $input);
$output = [];
foreach ($result as $item) {
    if (array_key_exists($item['pid'], $output)) {
        $output[$item['pid']]['p_v_list'] =
            array_merge(
            $output[$item['pid']]['p_v_list'],
            $item['p_v_list']
        );
    } else {
        $output[$item['pid']] = $item;
    }
}

print_r(array_values($output));

2017年3月9日 11:43
編輯回答
鐧簞噯

感覺樓主就是不想用foreach而已.

$result = array_reduce($input, function($result, $item) {
    if (!isset($result[$item['prop']['pid']])) {
        $result[$item['prop']['pid']] = array_merge($item['prop'], ['p_v_list' => []]);
    }
    $result[$item['prop']['pid']]['p_v_list'][] = [
        'vid' => $item['vid'],
        'v_name' => $item['v_name']
    ];
    return $result;
}, []);

print_r(array_values($result));
2017年4月10日 20:02
編輯回答
安于心
$new_input = [];
foreach ($input as $key => $value) {
    if (!isset($new_input[$value['prop']['pid']])) {
        $new_input[$value['prop']['pid']] = [
            'pid'    => $value['prop']['pid'],
            'p_name' => $value['prop']['p_name'],
        ];
    }
    $new_input[$value['prop']['pid']]['p_v_list'][] = [
        'vid'    => $value['vid'],
        'v_name' => $value['v_name']
    ];
}

這樣就可以了吧
比樓主少了一個array_key_exists

2018年7月18日 17:23