Слить 2 асоциативных массива (php)

239
01 марта 2017, 22:31

Есть 2 массива.

Первый - показы по датам

[0] => Array
    (
        [date] => 20170224
        [total_views] => 41
    )
[1] => Array
    (
        [date] => 20170225
        [total_views] => 7
    )
[2] => Array
    (
        [date] => 20170226
        [total_views] => 750
    )
[3] => Array
    (
        [date] => 20170227
        [total_views] => 50
    )

Второй - клики по датам

[0] => Array
(
    [date] => 20170224
    [total_clicks] => 418
)
[1] => Array
    (
        [date] => 20170225
        [total_clicks] => 72
    )
[2] => Array
    (
        [date] => 20170226
        [total_clicks] => 50
    )

Как видите некоторые даты в 2 массивах не совпадают. Да и сами массивы могут отличатся количеством элементов. Нужно обьеденить эти 2 массива в один. А там где данных нет поставить 0.

Должен получиться такой массив.

[0] => Array
(
    [date] => 20170224
    [total_views] => 41
    [total_clicks] => 418
)
[1] => Array
(
    [date] => 20170225
    [total_views] => 7
    [total_clicks] => 72
)
[2] => Array
(
    [date] => 20170226
    [total_views] => 750
    [total_clicks] => 50
)   

[3] => Array
(
    [date] => 20170227
    [total_views] => 50
    [total_clicks] => 0
)   

Как видите за 20170227 кликов нет - стоит 0. Но может быть и на оборот, клики есть а показов нет.

Answer 1

Постройте для начала индекс, по датам:

$res = [];
foreach ($arr1 as $row) {
  $row['total_clicks'] = 0;
  $res[$row['date']] = $row;
}

Потом добавьте клики из второго массива:

foreach($arr2 as $row) {
  if (isset($res[$row['date']])) {
    $res[$row['date']]['total_clicks'] = $row['total_clicks'];
  } else {
    $row['total_views'] = 0;
    $res[$row['date']] = $row;
  }
}

Если не нужны даты в ключах - сбросьте:

$res = array_values($res);
Answer 2

Писал с ходу, надеюсь, не ошибся

 $array3 = array();
 $i=0;
 foreach($array1 as $v1){
     $array3[$i]['date'] = $v['date'];
     $array3[$i]['total_views'] = $v['total_views'];
     $array3[$i]['total_clicks'] = 0;
     $i++;
 }
 foreach($array2 as $v2){
      $f = false;
      foreach($array3 as $v3){
         if($v3['date'] == $v2['date']) {
           $v3['total_clicks']=$v2['total_clicks'];
           $f = true;
         }
      }
      if(!$f) $array3[]=array('date'=>$v2['date'],'total_clicks'=>$v2['total_clicks'],'total_views'=>0);
}
Answer 3
$arrayFix = array();
for($i=0; $i<count($arrayFirst); $i++){
  $arrayFix[] = array(
    "date" => $arrayFirst[$i]["date"],
    "total_views" => $arrayFirst[$i]["total_views"],
    "total_clicks" => "0"
  );
}
for($i=0; $i<count($arrayFix); $i++){
  $date_view = $arrayFix[$i]["date"];
  for($j=0; $j<count($arrayFix); $j++){
    if($date_view==$arraySecont[$j]["date"]){
      $arrayFix[$j]["total_clicks"] = $arraySecont[$j]["total_clicks"];
    }
  }
}
print_r($arrayFix);
READ ALSO
Не приходят ообщения из формы обратной связи

Не приходят ообщения из формы обратной связи

PHP не знаю, к сожалениюПытаюсь прикрутить к сайту готовую форму, код которой нашла в сети

253
перечислить все дни с текущей даты

перечислить все дни с текущей даты

нужно вывести все даты начиная с текущей, и не больше 30 дней

173
PHP, HTML from &lt;textarea&gt; Принять значение

PHP, HTML from <textarea> Принять значение

Добрый деньУ меня есть такая часть кода:

166
Проблема со скриптом авторепоста в ВК

Проблема со скриптом авторепоста в ВК

Всем привет, нужна помощь в решении проблемы со скриптом для ВК: скрипт берет посты с одной группы и отправляет в другуюПроблема заключается...

346