JackShcherbakov
@JackShcherbakov

Массив дат. Как заменить кучу записей интервалом дат?

Здравствуйте, коллеги! Весь день мучаюсь над этой задачкой.

Вообщем, есть база данных. С этой базы данных PHP-скрипт собирает записи и формирует массив. Вообщем в итоге получается вот такой вот массив:

array(7) {
  ["2018.05.22"]=>
  array(1) {
    [0]=>
    array(9) {
      ["time"]=>
      string(5) "12:00"
      ["duration"]=>
      int(0)
      ["meeting_place"]=>
      string(0) ""
      ["price"]=>
      int(0)
      ["groups"]=>
      int(0)
      ["people"]=>
      int(0)
      ["pt_discount"]=>
      int(0)
      ["ch_discount"]=>
      int(0)
      ["guide_phone"]=>
      string(0) ""
    }
  }
  ["2018.05.25"]=>
  array(1) {
    [0]=>
    array(9) {
      ["time"]=>
      string(5) "12:00"
      ["duration"]=>
      int(0)
      ["meeting_place"]=>
      string(0) ""
      ["price"]=>
      int(0)
      ["groups"]=>
      int(0)
      ["people"]=>
      int(0)
      ["pt_discount"]=>
      int(0)
      ["ch_discount"]=>
      int(0)
      ["guide_phone"]=>
      string(0) ""
    }
  }
  ["2018.05.26"]=>
  array(1) {
    [0]=>
    array(9) {
      ["time"]=>
      string(5) "12:00"
      ["duration"]=>
      int(0)
      ["meeting_place"]=>
      string(0) ""
      ["price"]=>
      int(0)
      ["groups"]=>
      int(0)
      ["people"]=>
      int(0)
      ["pt_discount"]=>
      int(0)
      ["ch_discount"]=>
      int(0)
      ["guide_phone"]=>
      string(0) ""
    }
  }
  ["2018.05.27"]=>
  array(1) {
    [0]=>
    array(9) {
      ["time"]=>
      string(5) "12:00"
      ["duration"]=>
      int(0)
      ["meeting_place"]=>
      string(0) ""
      ["price"]=>
      int(0)
      ["groups"]=>
      int(0)
      ["people"]=>
      int(0)
      ["pt_discount"]=>
      int(0)
      ["ch_discount"]=>
      int(0)
      ["guide_phone"]=>
      string(0) ""
    }
  }
  ["2018.05.28"]=>
  array(1) {
    [0]=>
    array(9) {
      ["time"]=>
      string(5) "12:00"
      ["duration"]=>
      int(0)
      ["meeting_place"]=>
      string(0) ""
      ["price"]=>
      int(0)
      ["groups"]=>
      int(0)
      ["people"]=>
      int(0)
      ["pt_discount"]=>
      int(0)
      ["ch_discount"]=>
      int(0)
      ["guide_phone"]=>
      string(0) ""
    }
  }
  ["2018.05.29"]=>
  array(1) {
    [0]=>
    array(9) {
      ["time"]=>
      string(5) "12:00"
      ["duration"]=>
      int(0)
      ["meeting_place"]=>
      string(0) ""
      ["price"]=>
      int(0)
      ["groups"]=>
      int(0)
      ["people"]=>
      int(0)
      ["pt_discount"]=>
      int(0)
      ["ch_discount"]=>
      int(0)
      ["guide_phone"]=>
      string(0) ""
    }
  }
  ["2018.05.30"]=>
  array(1) {
    [0]=>
    array(9) {
      ["time"]=>
      string(5) "12:00"
      ["duration"]=>
      int(0)
      ["meeting_place"]=>
      string(0) ""
      ["price"]=>
      int(0)
      ["groups"]=>
      int(0)
      ["people"]=>
      int(0)
      ["pt_discount"]=>
      int(0)
      ["ch_discount"]=>
      int(0)
      ["guide_phone"]=>
      string(0) ""
    }
  }
}


Мне необходимо сделать так, чтобы в массиве не было повторяющихся значений. В моем случае повторяется этот массив:
array(9) {
      ["time"]=>
      string(5) "12:00"
      ["duration"]=>
      int(0)
      ["meeting_place"]=>
      string(0) ""
      ["price"]=>
      int(0)
      ["groups"]=>
      int(0)
      ["people"]=>
      int(0)
      ["pt_discount"]=>
      int(0)
      ["ch_discount"]=>
      int(0)
      ["guide_phone"]=>
      string(0) ""
    }

Но сложность в том, что нужно не просто удалить все повторяющеися элементы. Вот так примерно должен выглядеть итоговый массив:
$arr = array(
"2018.05.22-2018.05.30" => array(9) {
      "time"=> "12:00"
      "duration"=> 0
     //ну и остальные ключи
);


Я надеюсь суть понятна. То есть мы просто убираем все даты с одинаковыми данными (время, место встречи и т.п) и просто заменяем это на промежуток.

Это можно как-то сделать в 10 - 20 строк кода. Я весь день бьюсь над этим. Чего только я не перепробовал.

Заранее выражаю огромную благодарность всем, кто поможет.
  • Вопрос задан
  • 131 просмотр
Решения вопроса 1
JackShcherbakov
@JackShcherbakov Автор вопроса
Наконец-то! Вот так сделал.
$new_arr = array();
foreach ($arr as $date => $sessions) {
	$new_key = 0;
	foreach ($arr as $date2 => $sessions2) {

			if($sessions2 == $sessions){
				//$new_arr[$date] = $sessions;
				$new_key = preg_split("/-/", $new_key)[0];
				$new_key = "$date-$date2";
				unset($arr[$date2]);
			}			
	}
	if($new_key!=0) $new_arr[$new_key] = $sessions;
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
oxyberg
@oxyberg
Продуктовый дизайнер ВКонтакте
Ну, проходишь через всю структуру циклом. Собираешь в какую-нибудь коллекцию дубликатов повторяющиеся значения (делаешь как бы group by). Потом проходишь через коллекцию дубликатов, там у тебя в каждом элементе массива должны быть дубликаты этой встречи. Находишь минимальную и максимальную дату для этого набора дубликатов и собираешь интервал.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы