Объединить два массива и изменить в одном из них ключи

Имеем два массива: $product

Array
(
    [0] => Array
        (
            [id] => 16190
            [category_id] => 2087
            [product_title] => KOMAR Фотообои KOMAR 1424 
            [alias] => komar-fotooboi-komar-1-424-
            [img] => 1-424_Spiderman_Rooftop_hd_enl.jpg
            [content] => 
            [price] => 1600
            [band_title] => Komar
        )

    [1] => Array
        (
            [id] => 16198
            [category_id] => 2087
            [product_title] => KOMAR, Фотообои KOMAR 1425
            [alias] => komar-fotooboi-komar-1-425
            [img] => 1-425_Spiderman_Rush_Hour_hd_enl.jpg
            [content] => 
            [price] => 1600
            [band_title] => Komar
        )

    [2] => Array
        (
            [id] => 16200
            [category_id] => 2087
            [product_title] => KOMAR, Фотообои KOMAR 1426
            [alias] => komar-fotooboi-komar-1-426
            [img] => 1-426_Spiderman_Neon_hd_enl.jpg
            [content] => 
            [price] => 1600
            [band_title] => Komar
        )
)

$properties

Array
(
    [0] => Array
        (
            [product_id] => 16190
            [title_prop] => Производитель
            [value_prop] => KOMAR
        )

    [1] => Array
        (
            [product_id] => 16190
            [title_prop] => Узор
            [value_prop] => Детский
        )

    [2] => Array
        (
            [product_id] => 16190
            [title_prop] => Назначение
            [value_prop] => Для детской
        )

    [3] => Array
        (
            [product_id] => 16198
            [title_prop] => Производитель
            [value_prop] => KOMAR
        )

    [4] => Array
        (
            [product_id] => 16198
            [title_prop] => Узор
            [value_prop] => Детский
        )

    [5] => Array
        (
            [product_id] => 16198
            [title_prop] => Назначение
            [value_prop] => Для детской
        )

    [6] => Array
        (
            [product_id] => 16200
            [title_prop] => Производитель
            [value_prop] => KOMAR
        )

    [7] => Array
        (
            [product_id] => 16200
            [title_prop] => Узор
            [value_prop] => Детский
        )

    [8] => Array
        (
            [product_id] => 16200
            [title_prop] => Назначение
            [value_prop] => Для детской
        )
)

Массивы могу быть и такого вида, как удобнее для переделки: $product

Array
(
    [16190] => Array
        (
            [category_id] => 2087
            [product_title] => KOMAR Фотообои KOMAR 1424 
            [alias] => komar-fotooboi-komar-1-424-
            [img] => 1-424_Spiderman_Rooftop_hd_enl.jpg
            [content] => 
            [price] => 1600
            [band_title] => Komar
        )

    [16198] => Array
        (
            [category_id] => 2087
            [product_title] => KOMAR, Фотообои KOMAR 1425
            [alias] => komar-fotooboi-komar-1-425
            [img] => 1-425_Spiderman_Rush_Hour_hd_enl.jpg
            [content] => 
            [price] => 1600
            [band_title] => Komar
        )

    [16200] => Array
        (
            [category_id] => 2087
            [product_title] => KOMAR, Фотообои KOMAR 1426
            [alias] => komar-fotooboi-komar-1-426
            [img] => 1-426_Spiderman_Neon_hd_enl.jpg
            [content] => 
            [price] => 1600
            [band_title] => Komar
        )
)

$properties

Array
(
    [16190] => Array
        (
            [title_prop] => Назначение
            [value_prop] => Для детской
        )

    [16198] => Array
        (
            [title_prop] => Назначение
            [value_prop] => Для детской
        )

    [16200] => Array
        (
            [title_prop] => Назначение
            [value_prop] => Для детской
        )
)

На выходе хотелось бы иметь такую структуру, в первом случае:

Array
(
    [0] => Array
        (
            [id] => 16190
            [category_id] => 2087
            [product_title] => KOMAR Фотообои KOMAR 1424 
            [alias] => komar-fotooboi-komar-1-424-
            [img] => 1-424_Spiderman_Rooftop_hd_enl.jpg
            [content] => 
            [price] => 1600
            [band_title] => Komar
            [manufacturer_title] = Производитель
            [manufacturer_value] = KOMAR
            [pattern_title] = Узор
            [pattern_value] = Детский
            [appointment_title] = Назначение
            [appointment_value] = Для детской
        )

    [1] => Array
        (
            [id] => 16198
            [category_id] => 2087
            [product_title] => KOMAR, Фотообои KOMAR 1425
            [alias] => komar-fotooboi-komar-1-425
            [img] => 1-425_Spiderman_Rush_Hour_hd_enl.jpg
            [content] => 
            [price] => 1600
            [band_title] => Komar
            [manufacturer_title] = Производитель
            [manufacturer_value] = KOMAR
            [pattern_title] = Узор
            [pattern_value] = Детский
            [appointment_title] = Назначение
            [appointment_value] = Для детской
        )

    [2] => Array
        (
            [id] => 16200
            [category_id] => 2087
            [product_title] => KOMAR, Фотообои KOMAR 1426
            [alias] => komar-fotooboi-komar-1-426
            [img] => 1-426_Spiderman_Neon_hd_enl.jpg
            [content] => 
            [price] => 1600
            [band_title] => Komar
            [manufacturer_title] = Производитель
            [manufacturer_value] = KOMAR
            [pattern_title] = Узор
            [pattern_value] = Детский
            [appointment_title] = Назначение
            [appointment_value] = Для детской
        )
)

Во втором случае:

Array
(
    [16190] => Array
        (
            [category_id] => 2087
            [product_title] => KOMAR Фотообои KOMAR 1424 
            [alias] => komar-fotooboi-komar-1-424-
            [img] => 1-424_Spiderman_Rooftop_hd_enl.jpg
            [content] => 
            [price] => 1600
            [band_title] => Komar
            [manufacturer_title] = Производитель
            [manufacturer_value] = KOMAR
            [pattern_title] = Узор
            [pattern_value] = Детский
            [appointment_title] = Назначение
            [appointment_value] = Для детской
        )

    [16198] => Array
        (
            [category_id] => 2087
            [product_title] => KOMAR, Фотообои KOMAR 1425
            [alias] => komar-fotooboi-komar-1-425
            [img] => 1-425_Spiderman_Rush_Hour_hd_enl.jpg
            [content] => 
            [price] => 1600
            [band_title] => Komar
            [manufacturer_title] = Производитель
            [manufacturer_value] = KOMAR
            [pattern_title] = Узор
            [pattern_value] = Детский
            [appointment_title] = Назначение
            [appointment_value] = Для детской
        )

    [16200] => Array
        (
            [category_id] => 2087
            [product_title] => KOMAR, Фотообои KOMAR 1426
            [alias] => komar-fotooboi-komar-1-426
            [img] => 1-426_Spiderman_Neon_hd_enl.jpg
            [content] => 
            [price] => 1600
            [band_title] => Komar
            [manufacturer_title] = Производитель
            [manufacturer_value] = KOMAR
            [pattern_title] = Узор
            [pattern_value] = Детский
            [appointment_title] = Назначение
            [appointment_value] = Для детской
        )
)

Пытался разобрать массив $properties таким образом:

foreach ($properties as $key => $val) {
                if ($val['title_prop'] == 'Производитель') {
                    $val['manufacturer_title'] = $val['title_prop'];
                    $val['manufacturer_value'] = $val['value_prop'];
                    $properties[$key] = [$val['manufacturer_title'] => $val['manufacturer_value']];
                }
                if ($val['title_prop'] == 'Цвет') {
                    $val['color_title'] = $val['title_prop'];
                    $val['color_value'] = $val['value_prop'];
                    $properties[$key] = [$val['color_title'] => $val['color_value']];
                }
                if ($val['title_prop'] == 'Назначение') {
                    $val['appointment_title'] = $val['title_prop'];
                    $val['appointment_value'] = $val['value_prop'];
                    $properties[$key] = [$val['appointment_title'] => $val['appointment_value']];
                }
                if ($val['title_prop'] == 'Узор') {
                    $val['pattern_title'] = $val['title_prop'];
                    $val['pattern_value'] = $val['value_prop'];
                    $properties[$key] = [$val['pattern_title'] => $val['pattern_value']];
                }
                if ($val['title_prop'] == 'Материал покрытия') {
                    $val['coating_material_title'] = $val['title_prop'];
                    $val['coating_material_value'] = $val['value_prop'];
                    $properties[$key] = [$val['coating_material_title'] => $val['coating_material_value']];
                }
                if ($val['title_prop'] == 'Материал основы') {
                    $val['base_material_title'] = $val['title_prop'];
                    $val['base_material_value'] = $val['value_prop'];
                    $properties[$key] = [$val['base_material_title'] => $val['base_material_value']];
                }
            }

Но неудачно, на выходе получаю:

Array
(
    [16190] => Array
        (
            [Назначение] => Для детской
        )

    [16198] => Array
        (
            [Назначение] => Для детской
        )

    [16200] => Array
        (
            [Назначение] => Для детской
        )
)

Капец..., бьюсь второй день и ничего не могу придумать... Но в любом случае, после разбора все равно их еще и объединить нужно.


Ответы (1 шт):

Автор решения: Алексей Шиманский

Очевидно, что раз уж тут два массива, то и циклов должно быть два.

По свойствам - самое простое, чтобы не городить if'ы - составить карту имён свойств


$products = [
    ['id' => 16190, 'category_id' => 2087, 'product_title' => 'KOMAR Фотообои KOMAR 1424'],
    ['id' => 16198, 'category_id' => 2087, 'product_title' => 'KOMAR, Фотообои KOMAR 1425'],
    ['id' => 16200, 'category_id' => 2087, 'product_title' => 'KOMAR, Фотообои KOMAR 1426'],
];

$properties = [
    ['product_id' => 16190, 'title_prop' => 'Производитель', 'value_prop' => 'KOMAR'],
    ['product_id' => 16190, 'title_prop' => 'Узор', 'value_prop' => 'Детский'],
    ['product_id' => 16190, 'title_prop' => 'Назначение', 'value_prop' => 'Для детской'],
    ['product_id' => 16198, 'title_prop' => 'Производитель', 'value_prop' => 'KOMAR'],
    ['product_id' => 16198, 'title_prop' => 'Узор', 'value_prop' => 'Детский'],
    ['product_id' => 16198, 'title_prop' => 'Назначение', 'value_prop' => 'Просто так'],
];

$propNamesMap = ['Производитель' => 'manufacturer', 'Узор' => 'pattern', 'Назначение' => 'appointment'];


foreach ($products as &$product) {
    foreach ($properties as $property) {
        if ($product['id'] === $property['product_id']) {
            $keyName = $propNamesMap[$property['title_prop']];
            
            $product[$keyName . '_title'] = $property['title_prop'];
            $product[$keyName . '_value'] = $property['value_prop'];
        }
    }
}

print_r($products);

output:

Array
(
    [0] => Array
        (
            [id] => 16190
            [category_id] => 2087
            [product_title] => KOMAR Фотообои KOMAR 1424
            [manufacturer_title] => Производитель
            [manufacturer_value] => KOMAR
            [pattern_title] => Узор
            [pattern_value] => Детский
            [appointment_title] => Назначение
            [appointment_value] => Для детской
        )

    [1] => Array
        (
            [id] => 16198
            [category_id] => 2087
            [product_title] => KOMAR, Фотообои KOMAR 1425
            [manufacturer_title] => Производитель
            [manufacturer_value] => KOMAR
            [pattern_title] => Узор
            [pattern_value] => Детский
            [appointment_title] => Назначение
            [appointment_value] => Просто так
        )

    [2] => Array
        (
            [id] => 16200
            [category_id] => 2087
            [product_title] => KOMAR, Фотообои KOMAR 1426
        )

)

А вообще не знаю зачем такое вообще делать. Самое простое - оставить как есть и в нужных местах просто пробегаться по свойствам нужного продукта, чуть сложнее - сделать структуру такого вида:

[
    [
        product_id => 111
        category => 222
        some_data => 333
        properties => [
            many
            props
        ]
    ],
    [
        product_id => 555
        category => 666
        some_data => 777
        properties => [
            many
            props
        ]
    ],
]
→ Ссылка