合并开放时间相似的日期

11

我该如何在PHP中(使用CodeIgniter)编写一个函数,将具有相似开放时间的商店的营业日合并在一起。例如,如果我们有:

Mon 9am-5pm
Tue 9am-5pm
Wed 9am-5pm
Thu 9am-5pm
Fri 9am-5pm
Sat 9am-7pm
Sun 9am-7pm

我希望将这段代码简化为:

Mon-Fri 9am-5pm
Sat-Sun 9am-7pm

我该如何在不使用长长的if/else或case ifs语句的情况下完成这个任务?我正在使用CodeIgniter..


你把defs存储在哪里?是在一个数组中,以天为键,以小时为值吗? - Majid Fouladpour
2个回答

12
<?php
$openHours = array(
    'Mon' => '9am-5pm',
    'Tue' => '9am-5pm',
    'Wed' => '9am-9pm',
    'Thu' => '9am-5pm',
    'Fri' => '9am-5pm',
    'Sat' => '9am-7pm',
    'Sun' => '9am-7pm'
);

$summaries = array();
foreach ($openHours as $day => $hours) {
    if (count($summaries) === 0) {
        $current = false;
    } else {
        $current = &$summaries[count($summaries) - 1];
    }
    if ($current === false || $current['hours'] !== $hours) {
        $summaries[] = array('hours' => $hours, 'days' => array($day));
    } else {
        $current['days'][] = $day;
    }
}

foreach ($summaries as $summary) {
    if (count($summary['days']) === 1) {
        echo reset($summary['days']) . ' ' . $summary['hours'] . PHP_EOL;
    } else {
        echo reset($summary['days']) . '-' . end($summary['days']) . ' ' . $summary['hours'] . PHP_EOL;
    }
}

codepad示例


干得好。你可以用 $summary[$hours][] = $day; 来替换整个 if/else 语句。 - Austin
1
当他们决定在周三晚些时候继续营业时会发生什么? - gilly3
嗯,实际上这会搞乱结果。 - peaceman

0
如果您想要以下格式:
Sun-Tue,Fri-Sat:11am-12am;Wed:10am-12am;Thu:9am-12am
这将分组处理一周内的不同时间和日期:
<?php
$open_hours = array (
    "Sun" => "11am-12am",
    "Mon" => "11am-12am",
    "Tue" =>  "11am-12am",
    "Wed" =>  "10am-12am",
    "Thu" =>  "9am-12am",
    "Fri" =>  "11am-12am",
    "Sat" =>  "11am-12am"
);

$result = [];
foreach ($open_hours as $day => $hours) {
    if (empty($result) || $previous !== $hours) {
        $result[$hours][] = $day;
    } elseif ($previous === $hours) {
        $key = array_key_last($result[$hours]);
        $current = strtok($result[$hours][$key], '-');
        $result[$hours][$key] = $current.'-'.$day;
    }
    $previous = $hours;
}

// build output (joining days with ,)
$output = [];
foreach ($result as $hours => $days) {
    $output[] = implode(', ', $days).': '.$hours;
}
// join with ;'s and output
echo implode('; ', $output);

https://3v4l.org/tKOlI


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接