Объединить два массива и изменить в одном из них ключи
Имеем два массива: $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
]
],
]