【问题标题】:How can I merge consecutive subArrays which have the same data in it?如何合并其中具有相同数据的连续子数组?
【发布时间】:2015-09-30 22:32:11
【问题描述】:

我有这个数组:

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

有什么想法吗?

【问题讨论】:

  • @FrancescoAbeni 我尝试遍历 $opening_hours 数组,并检查数组的下一个元素是否与当前元素相同,但不知何故这不起作用。 Rizier123 做了我需要的解释。

标签: php arrays multidimensional-array merge associative-array


【解决方案1】:

这应该适合你:

所以基本上你只需遍历整个数组并检查下一个元素是否仍然设置并且当前数组与下一个相同(这意味着它们具有相同的小时数)。如果是,则执行此操作,直到 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]];

如果您只有 1 天的时间相同,您只需将其添加到结果数组中即可。这段代码是什么:

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

【讨论】:

  • 感谢您的解释和整个功能。它确实像它应该的那样工作。在问这个问题之前,我已经开始将数组的下一个元素与当前元素进行比较,在我的情况下它不起作用。再次感谢你。
  • @David 更新了我的答案并简化了一切。希望它更容易理解
猜你喜欢
  • 2023-02-24
  • 1970-01-01
  • 2019-12-20
  • 2011-08-18
  • 2014-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多