добавить данные из 1 массива в другой

#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'];
}