Конкретный массив слияния с датами в php

У меня есть два массива:

array:5 [▼
  0 => "1 Oct 2016"
  1 => "2 Oct 2016"
  2 => "3 Oct 2016"
  3 => "4 Oct 2016"
  4 => "5 Oct 2016"
]

а также

array:5 [▼
  0 => "29 Sep 2016"
  1 => "30 Sep 2016"
  2 => "1 Oct 2016"
  3 => "2 Oct 2016"
  4 => "3 Oct 2016"
]

Мне нужно объединить их в один с сортировкой по дате, чтобы получить что-то вроде этого:

array:7 [▼
  0 => "29 Sep 2016"
  1 => "30 Sep 2016"
  2 => "1 Oct 2016"
  3 => "2 Oct 2016"
  4 => "3 Oct 2016"
  5 => "4 Oct 2016"
  6 => "5 Oct 2016"
]

Как я могу это сделать?

2 ответа

Решение

Вы можете сделать это с array_merge (чтобы получить один массив), array_unique (для устранения дубликатов) и usort (чтобы получить их в правильном порядке):

$c = array_unique(array_merge($a, $b));
usort($c, function($a, $b) { return strtotime($a) - strtotime($b); });

Посмотрите, как это работает на eval.in.

<?php

function _sort($a, $b)
{
    $a = DateTime::createFromFormat('d M Y', $a);
    $b = DateTime::createFromFormat('d M Y', $b);

    if ($a == $b) return 0;

    return ($a < $b) ? -1 : 1;
}

$a =  [
  0 => "1 Oct 2016",
  1 => "2 Oct 2016",
  2 => "3 Oct 2016",
  3 => "4 Oct 2016",
  4 => "5 Oct 2016",
];

$b = [
  0 => "29 Sep 2016",
  1 => "30 Sep 2016",
  2 => "1 Oct 2016",
  3 => "2 Oct 2016",
  4 => "3 Oct 2016",
];

$merged = array_merge($a, $b);
# sort
usort($merged, '_sort');

print_r($merged);
Другие вопросы по тегам