2015-07-12 75 views
8

我有这个数组:如何合并具有相同数据的连续子数组?

$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'), 
); 

任何想法?

+0

@FrancescoAbeni我已经通过$ OPENING_HOURS阵列试图环和我检查数组的下一个元素是否与当前元素相同,但不知何故,这不起作用。 Rizier123完成了我所需要的解释。 – David

回答

7

这应该为你工作:通过你的整个阵列

所以基本上你只是循环,并检查下一个元素仍然设置和当前的数组是一样的下一个(这意味着它们具有相同的小时)。如果是,则直到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 
     ) 

) 

Demo

+0

谢谢你的解释和整个功能。它的确如此工作。在问这个问题之前,我已经开始将数组的下一个元素与当前数组中的元素进行比较,但在这种情况下它并不起作用。再次告诉你。 – David

+0

@大卫不客气。 – Rizier123

+0

@大卫更新了我的答案,并简化了一切。希望它更易于理解 – Rizier123

相关问题