Объединить 2 массива

[1=>20, 30 => 40, 98 => 99]
[1=>5, 37 => 42, 80 => 99]

2 массива, каждый массив это отрезки, которые просмотрел пользователь в видео. Значения от 0 до 100

Где ключ - старт проигрывания, значение - окончание.

Возьмем первый

[1=>20, 30 => 40, 98 => 99]

Пользователь начал смотреть с 1 процента на 20%, перемотал на 30% и просмотрел до 40, затем с 98 по 99%

Вопрос каким образом, что за алгоритм, который будет обрабатывать быстро. Так как частота выполнения данной задачи высокая.

Необходимо 2 массива объединить и получить на выходе

    [1 => 20, 30 => 42, 80 => 99]

$m  = [1=>6, 8 => 11, 79 => 99];
$m1 = [0=>5, 11 => 45, 45 =>55, 80 => 95];

$s = 101;
for ($i = 0; $i <= 100; $i++) {

  if(($m[$i] || $m1[$i]) && $s == 101) {
     $s = $i;
     $max = max($m[$i], $m1[$i]);
  }

  if($mm[$s] < $m[$i])
   $mm[$s] = $m[$i];

  if($mm[$s] < $m1[$i])
   $mm[$s] = $m1[$i];

  $max <= $i && $s = 101;

}

print_r($mm);

Ничего не получается...

Казалось что все работает

Array ( [0] => 6 [8] => 45 [45] => 55 [79] => 99 )

[8] => 45 [45] => 55

Должнно быть

8 => 55

Ответы (1 шт):

Автор решения: MBo

Сложите в массив пары, содержащие все временные отсчеты, а вторым элементом +1 для начала интервала, или -1 для конца. Отсортируйте по времени.

Теперь пройдите по массиву, добавляя к счётчику второй элемент пар. Если счетчик стал ненулевым - начался объединенный интервал, если обнулился - интервал кончился.

Если массивов всегда будет только два, то ещё проще - продвигаетесь по обоим массивам параллельно, выбирая минимальную из следующих временных отметок и соответственно меняя состояние.

→ Ссылка