Php 如何合并具有相同数据的连续子阵列?
我有这个阵列:Php 如何合并具有相同数据的连续子阵列?,php,arrays,multidimensional-array,merge,associative-array,Php,Arrays,Multidimensional Array,Merge,Associative Array,我有这个阵列: $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'),
$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++;
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);
然后,如果有多个条目,则创建一个从一天到另一天的范围。这是什么代码:
$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);
如果您只有1天的相同时间,只需将其添加到结果数组中即可。这是什么代码:
$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);
根据相同的小时数可以跳过下一个数组元素。这是什么代码:
$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);
完整代码:
<?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);
?>
@FrancescoAbeni我曾尝试循环使用$opening_hours数组,并检查数组的下一个元素是否与当前元素相同,但不知何故,这没有起作用。Rizier123做了我需要的解释。谢谢你的解释和整个功能。它确实能正常工作。在问这个问题之前,我已经开始比较数组的下一个元素和当前元素,在我的例子中,它不起作用。大卫更新了我的答案,把一切都简化了一点。希望它更容易理解