#php #mysql #arrays
#php #mysql #массивы
Вопрос:
просмотрев множество вопросов здесь, я все еще не могу найти ответ, который соответствует моей ситуации.
я пытаюсь объединить 2 поля из массива # 2 в массив # 1
Массив #1
Массив ( [0] => Массив ( [id] => 1 [позиция] => top_banner_1 [имя] => Верхний баннер 1 [порядок] => 1 ) [1] => Массив ( [id] => 2 [позиция] => left_banner_1 [name] => Левый баннер 1 [порядок] => 2 ) )
Массив #2
Массив ( [статус] => 0 [страны] => [module_status] => 1 [top_banner_1_status] => 1 [top_banner_1_display] => 0 [left_banner_1_status] => 1 [left_banner_1_display] => 0 [left_banner_2_status] => 1 [left_banner_2_display] => 0 [left_banner_3_status] => 1 [left_banner_3_display] => 0 [left_banner_4_status] => [left_banner_4_display] => 0 [left_banner_5_status] => [left_banner_5_display] => 0 [center_banner_1_status] => [center_banner_1_display] => 0 [center_banner_2_status] => [center_banner_2_display] => 0 [right_banner_1_status] => [right_banner_1_display] => 0 [right_banner_2_status] => [right_banner_2_display] => 0 [right_banner_3_status] => [right_banner_3_display] => 0 [right_banner_4_status] => [right_banner_4_display] => 0 [right_banner_5_status] =>правый_баннер_5_статус] => [right_banner_5_display] => 0 [bottom_banner_1_status] => [bottom_banner_1_display] => 0 )
чего я пытаюсь достичь, так это:
Массив ( [0] => Массив ( [id] => 1 [позиция] => top_banner_1 [имя] => Верхний баннер 1 [порядок] => 1 [top_banner_1_status] => 1 [top_banner_1_display] => 0 ) )
оба этих массива поступают из базы данных. в массиве # 1 13 областей, поэтому все, что я делал до сих пор, связано с циклами foreach, поскольку данные массива # 2 извлекаются из функции, которую в идеале я не могу редактировать.
я перепробовал довольно много array_*
функций, но у меня не очень быстро получается.
Комментарии:
1. Для этого нет встроенной функции, вам придется написать свою собственную
2. вот с чем я борюсь, поскольку мне никогда раньше не приходилось объединять 2 массива подобным образом
3. Что ж, вы показали нам входные данные и желаемый результат, никакого кода, с которым вы боролись.
Ответ №1:
Предполагая следующее рассуждение:
Array
(
[0] => Array
(
[id] => 1
[position] => top_banner_1
[name] => Top Banner 1
[order] => 1
[top_banner_1_status] => 1 // Added because of key is [position]_status.
[top_banner_1_display] => 0 // Added because of key is [position]_display.
)
)
Я бы сделал:
<?php
$array1 = // Array #1 from question.
$array2 = // Array #2 from question.
foreach ($array1 as $key => $item) {
$position = $item['position'];
$keySuffixes = array('_status', '_display');
foreach ($keySuffixes as $suff) {
if (array_key_exists($position . $suff, $array2)) {
$array1[$key][$position . $suff] = $array2[$position . $suff];
}
}
}
?>
Не элегантно, я знаю : (
Комментарии:
1. это достаточно элегантно, но работает отлично, это намного, намного более читаемо, чем то, с чем я начинал. Спасибо
Ответ №2:
Хитрость заключается в создании ключа в соответствии с ID для извлечения данных из $ arr2.
foreach($arr1 as $key=>$val){
$id = $val['id'];
$tb_status_key = "top_banner_{$id}_status";
$tb_display_key = "top_banner_{$id}_display";
$arr1[$key][$tb_status_key] = $arr2[$tb_status_key];
$arr1[$key][$tb_display_key] = $arr2[$tb_display_key];
}
Ответ №3:
Структура массива # 2 не совсем подходит для этой задачи. Если у вас есть возможность, вы должны изменить это примерно так:
Array
(
[top_banner_1] => Array (
[status] => 1
[display] => 0
)
[left_banner_1] => Array (
[status] => 1
[display] => 0
)
)
//and so on
Но если это невозможно, это должно сработать:
foreach($array1 as amp;$info) {
$status = $info['position'] . '_status';
$display = $info['position'] . '_display';
$info[$status] = $array2[$status];
$info[$display] = $array2[$display];
}
В противном случае это кажется более элегантным способом:
foreach($array1 as amp;$info) {
$info['status'] = $array2[$info['position']]['status'];
$info['display'] = $array2[$info['position']]['display'];
}