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

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

$opening_hours = array( 'Monday' => array('09:00', '17:00'), 'Tuesday' => array('09:00', '17:00'), 'Wednesday' => array('08:00', '13:00'), 'Thursday' => array('09:00', '17:00'), 'Friday' => array('09:00', '17:00'), 'Saturday' => array('10:00', '16:00'), 'Sunday' => array('Closed'), ); 

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

 $merged_opening_hours = array( 'Monday - Tuesday' => array('09:00', '17:00'), 'Wednesday' => array('08:00', '13:00'), 'Thursday - Friday' => array('09:00', '17:00'), 'Saturday' => array('10:00', '16:00'); 'Sunday' => array('Closed'), ); 

Есть идеи?

Это должно сработать для вас:

Таким образом, в основном вы просто просматриваете весь массив и проверяете, установлен ли следующий элемент, и текущий массив будет таким же, как и следующий (что означает, что они имеют одинаковые часы). Если да, вы делаете это до тех пор, пока цикл while не вернет false. Что это за код:

 $DayAmountOfConsecutiveSameHours = 1; while(isset($arrayKeys[($dayCount+$DayAmountOfConsecutiveSameHours)]) && ($opening_hours[$arrayKeys[$dayCount]] === $opening_hours[$arrayKeys[($dayCount+$DayAmountOfConsecutiveSameHours)]])) $DayAmountOfConsecutiveSameHours++; 

Затем, если у вас более 1 записи, вы создаете диапазон от одного до другого дня. Что это за код:

 if($DayAmountOfConsecutiveSameHours > 1) $result[$arrayKeys[$dayCount] . " - " . $arrayKeys[($dayCount+$DayAmountOfConsecutiveSameHours-1)]] = $opening_hours[$arrayKeys[$dayCount]]; 

Если у вас есть только один день с теми же часами, вы просто добавляете его в массив результатов. Что это за код:

 else $result[$arrayKeys[$dayCount]] = $opening_hours[$arrayKeys[$dayCount]]; 

И в зависимости от того, сколько дней в те же часы вы пропустите следующие элементы массива. Что это за код:

 $dayCount += ($DayAmountOfConsecutiveSameHours - 1); 

Полный код:

 <?php $opening_hours = [ "Monday" => ["09:00", "17:00"], "Tuesday" => ["09:00", "17:00"], "Wednesday" => ["08:00", "13:00"], "Thursday" => ["09:00", "17:00"], "Friday" => ["09:00", "17:00"], "Saturday" => ["10:00", "16:00"], "Sunday" => ["Closed"], ]; $amountOfDays = count($opening_hours); $arrayKeys = array_keys($opening_hours); for($dayCount = 0; $dayCount < $amountOfDays; $dayCount++) { $DayAmountOfConsecutiveSameHours = 1; while(isset($arrayKeys[($dayCount+$DayAmountOfConsecutiveSameHours)]) && ($opening_hours[$arrayKeys[$dayCount]] === $opening_hours[$arrayKeys[($dayCount+$DayAmountOfConsecutiveSameHours)]])) $DayAmountOfConsecutiveSameHours++; if($DayAmountOfConsecutiveSameHours > 1) $result[$arrayKeys[$dayCount] . " - " . $arrayKeys[($dayCount+$DayAmountOfConsecutiveSameHours-1)]] = $opening_hours[$arrayKeys[$dayCount]]; else $result[$arrayKeys[$dayCount]] = $opening_hours[$arrayKeys[$dayCount]]; $dayCount += ($DayAmountOfConsecutiveSameHours - 1); } print_r($result); ?> 

вывод:

 Array ( [Monday - Tuesday] => Array ( [0] => 09:00 [1] => 17:00 ) [Wednesday] => Array ( [0] => 08:00 [1] => 13:00 ) [Thursday - Friday] => Array ( [0] => 09:00 [1] => 17:00 ) [Saturday] => Array ( [0] => 10:00 [1] => 16:00 ) [Sunday] => Array ( [0] => Closed ) ) 

демонстрация