Как объединить некоторые поля второго массива в первый массив после сравнения значений ключей, общих для обоих массивов?

Мой вопрос звучит немного запутанно, но на самом деле он прост. Позвольте мне сначала описать вам сценарий. У меня есть два массива, а именно. $grid_data и $sent_data. Оба массива генерируются динамически в зависимости от пользовательского ввода. Так, например, я печатаю ниже содержимое обоих этих массивов:

$grid_data = Array
    (
        [0] => Array
            (
                [newsletter_id] => 1
                [newsletter_name] => Eywa Solutions
                [newsletter_subject] => Holi Wishes
                [newsletter_email_body] => Happy Holi to all the friends
                [newsletter_call_to_action_status] => 0
                [newsletter_call_to_action_text] => 
                [newsletter_call_to_action_link] => 
                [newsletter_status] => 2
                [newsletter_schedule] => 0
                [newsletter_created_date] => Mar 17 2014, 16:21 pm
                [newsletter_updated_date] => 0
            )

        [1] => Array
            (
                [newsletter_id] => 2
                [newsletter_name] => Akshay Nikte
                [newsletter_subject] => The Don
                [newsletter_email_body] => How are yoy Nikte Saheb?
                [newsletter_call_to_action_status] => 0
                [newsletter_call_to_action_text] => 
                [newsletter_call_to_action_link] => 
                [newsletter_status] => 2
                [newsletter_schedule] => 0
                [newsletter_created_date] => Mar 18 2014, 06:52 am
                [newsletter_updated_date] => 0
            )

    )

$sent_data = Array
        (
            [0] => Array
                (
                    [newsletter_id] => 1
                    [newsletter_sent_count] => 5
                    [newsletter_sent_date] => 1395121193
                )

            [1] => Array
                (
                    [newsletter_id] => 2
                    [newsletter_sent_count] => 7
                    [newsletter_sent_date] => 1395121227
                )

        )

Теперь я хочу сравнить значения ключа [newsletter_id] из обоих вышеупомянутых массивов друг с другом. Если совпадение найдено, добавьте пары ключ-значение ([newsletter_sent_count], [newsletter_sent_date]) в соответствующий массив из массива $grid_data. Если совпадение не найдено, вставьте пустые значения для этих ключей ([newsletter_sent_count], [newsletter_sent_date]). В приведенном выше случае окончательно сгенерированный $grid _data должен выглядеть следующим образом:

$grid_data = Array
    (
        [0] => Array
            (
                [newsletter_id] => 1
                [newsletter_name] => Eywa Solutions
                [newsletter_subject] => Holi Wishes
                [newsletter_email_body] => Happy Holi to all the friends
                [newsletter_call_to_action_status] => 0
                [newsletter_call_to_action_text] => 
                [newsletter_call_to_action_link] => 
                [newsletter_status] => 2
                [newsletter_schedule] => 0
                [newsletter_created_date] => Mar 17 2014, 16:21 pm
                [newsletter_updated_date] => 0
                [newsletter_sent_count] => 5
                [newsletter_sent_date] => 1395121193
            )

        [1] => Array
            (
                [newsletter_id] => 2
                [newsletter_name] => Akshay Nikte
                [newsletter_subject] => The Don
                [newsletter_email_body] => How are yoy Nikte Saheb?
                [newsletter_call_to_action_status] => 0
                [newsletter_call_to_action_text] => 
                [newsletter_call_to_action_link] => 
                [newsletter_status] => 2
                [newsletter_schedule] => 0
                [newsletter_created_date] => Mar 18 2014, 06:52 am
                [newsletter_updated_date] => 0
                [newsletter_sent_count] => 7
                [newsletter_sent_date] => 1395121227
            )

    )

Я хочу сделать это наиболее оптимальным образом. Я попытался использовать array_merge() для достижения этого, но мне это не удалось. Так может ли кто-нибудь из талантливых людей помочь мне в этом отношении, пожалуйста? Заранее спасибо. Если вам нужна дополнительная информация, я могу предоставить вам то же самое. Попытка, сделанная мной, заключается в следующем:

$arr_length = count($grid_data);


for($i=0; $i < $arr_length; $i++) {
  $track =0;
  foreach($sent_data as $value) {
    if($value['newsletter_id'] === $grid_data[$i]['newsletter_id'] ) {
      array_merge($grid_data[$i], $value);
      $track=1;
    }  
  }
  if($track === 0) {
    //insert blank value here
  }
}

person Community    schedule 18.03.2014    source источник


Ответы (1)


Сначала преобразуйте $sent_data в ассоциативный массив:

$sent_assoc = array();
foreach ($sent_data as $el) {
    $sent_assoc[$el['newsletter_id']] = $el;
}

Затем выполните слияние:

$default_sent = array('newsletter_sent_count' => null, 'newsletter_sent_date' => null);
foreach ($grid_data as &$el) {
    $id = $el['newsletter_id'];
    $sent = isset($sent_assoc[$id]) ? $sent_assoc[$id] : $default_sent;
    $el = array_merge($el, $sent);
}

Ссылка &$el используется для того, чтобы присваивание обновляло исходный массив.

Без ссылки второй цикл выглядит так:

foreach ($grid_data as $i => $el) {
    $id = $el['newsletter_id'];
    $sent = isset($sent_assoc[$id]) ? $sent_assoc[$id] : $default_sent;
    $grid_data[$i] = array_merge($el, $sent);
}
person Barmar    schedule 18.03.2014
comment
Спасибо за вашу помощь. Но это не работает. Печать пустой страницы. Не могли бы вы упростить свой код? - person ; 18.03.2014
comment
В строке $found = была лишняя скобка, я ее исправил. - person Barmar; 18.03.2014
comment
Насколько проще это может быть? - person Barmar; 18.03.2014
comment
@Barmer: Позвольте мне показать вам свою попытку. Хотя это не работает для меня, но вы можете понять, как я хочу простое решение. Для этого, пожалуйста, смотрите мой вопрос. Я обновил его своей попыткой. - person ; 18.03.2014
comment
array_merge возвращает новый массив с объединенными данными, он не изменяет массив на месте. Вам нужно назначить его обратно в $grid_data. Ваш метод вложенного цикла неэффективен, поскольку требует N * M сравнений. Вы должны по крайней мере поместить break во внутренний цикл, когда он найдет совпадение. - person Barmar; 18.03.2014
comment
: Да, твой трюк отлично сработал для меня. Но не могли бы вы попытаться сделать это проще, не используя ссылку. Это было бы большим подспорьем для меня. Спасибо за вашу огромную помощь. - person ; 18.03.2014
comment
Хорошо, я добавил версию без ссылки. Я не понимаю, как это делает его проще, это просто делает его более подробным. - person Barmar; 18.03.2014