【问题标题】:PHP switch statement for Time & Date时间和日期的 PHP switch 语句
【发布时间】:2019-01-18 16:01:59
【问题描述】:

我有一个非常复杂的交付情况,其中一个 switch 语句正在检查星期几和每天 16:00 的截止时间,并回显交付日,周一、周二和周三是今天 + 1 天,如果切断后它应该与今天的日期 + 2 相呼应,由于周末没有交货,因此星期四和星期五的交货日期完全不同

<?php
    $today = date("D");
        switch($today){
            case "Mon":
            if(mktime(16, 0, 0) <= time()) {
                    echo "<p>For Delivery on <strong> " . date('D jS', strtotime($Date. ' + 2 days')) . "</strong><p>";
                } else {
                    echo "<p>For Delivery on <strong> " . date('D jS', strtotime($Date. ' + 1 days')). "</strong><p>";
                }
                break;
            case "Tue":
                if(mktime(16, 0, 0) <= time()) {
                    echo "<p>For Delivery on <strong> " . date('D jS', strtotime($Date. ' + 2 days')). "</strong><p>";
                } else {
                    echo "<p>For Delivery on <strong> " . date('D jS', strtotime($Date. ' + 1 days')). "</strong><p>";
                }
                break;
            case "Wed":
                if(mktime(16, 0, 0) <= time()) {
                    echo "<p>For Delivery on <strong> " . date('D jS', strtotime($Date. ' + 2 days')). "</strong><p>";
                } else {
                    echo "<p>For Delivery on <strong> " . date('D jS', strtotime($Date. ' + 1 days')). "</strong><p>";
                }
                break;
            case "Thu":
            if(mktime(16, 0, 0) <= time()) {
                    echo "<p>For Delivery on <strong> " . date('D jS', strtotime($Date. ' + 4 days')). "</strong><p>";
                } else {
                    echo "<p>For Delivery on <strong> " . date('D jS', strtotime($Date. ' + 1 days')). "</strong><p>";
                }
                break;
            case "Fri":
                if(mktime(16, 0, 0) <= time()) {
                    echo "<p>For Delivery on <strong> " . date('D jS', strtotime($Date. ' + 5 days')). "</strong><p>";
                } else {
                    echo "<p>For Delivery on <strong> " . date('D jS', strtotime($Date. ' + 4 days')). "</strong><p>";
                }
                break;
            case "Sat":
                    echo "<p>For Delivery on <strong> " . date('D jS', strtotime($Date. ' + 4 days')). "</strong><p>";
                break;
            case "Sun":
                    echo "<p>For Delivery on <strong> " . date('D jS', strtotime($Date. ' + 3 days')). "</strong><p>";
                break;
            default:
                echo "No information available for that day.";
                break;
        }
        ?>

当然,它们一定是实现这一目标的更优雅的方式,任何人都知道实现相同结果的更清洁的方式吗?此代码有效,但可能会更好更短

【问题讨论】:

  • 对于任何代码,重要的是查看通用代码,看看是否可以仅提取差异。有很多代码只有 ' + 5 days' 之类的不同
  • 您可以使用date('N')W 获取一个数字,检查并添加到该数字。
  • 应该是周六 3 天和周日 2 天?

标签: php switch-statement


【解决方案1】:

请注意,您可以堆叠 case 执行相同操作的匹配项:

switch ($today) {
    case 'Mon':
    case 'Tue':
    case 'Wed':
        // code here
        break;
}

但你最好只创建一个包含当天所需值的小数组,然后使用日期名称作为数组索引来查找今天的值:

$leadtimes = [
    'Mon' => [1, 2], // first value is for before 16:00, second is for after
    'Tue' => [1, 2],
    'Wed' => [1, 2],
    'Thu' => [1, 4],
    'Fri' => [4, 5],
    'Sat' => [4, 4],
    'Sun' => [3, 3],
];

那么,计算提前期的代码就只有一行了:

$leadtime = $leadtimes[date('D')][date('H') < 16 ? 0 : 1];

然后像以前一样将其插入到您的输出中:

echo
    "<p>For Delivery on <strong> " .
    date('D jS', strtotime("$Date + $leadtime days")) .
    "</strong><p>";

现在,当您要更改交货时间时,无需编辑编码,只需调整数组中的值即可。

因为我已经有一段时间没有做任何代码高尔夫了,所以整件事都在一行中:

echo date('D jS',strtotime('+'.['Mon'=>[1,2],'Tue'=>[1,2],'Wed'=>[1,2],'Thu'=>[1,4],'Fri'=>[4,5],'Sat'=>[4,4],'Sun'=>[3,3]][date('D')][date('H')<16].'day'));

【讨论】:

  • strtotime($Date . ' + " . $leadtime days")) 这对我来说看起来不正确,你确定吗?
  • (我注意到$Date 没有在你的代码中设置,我假设你已经在其他地方设置了它。如果$Date 总是“现在”,那么你可以离开去掉$Date 部分并使用strtotime("+ $leadtime days")
【解决方案2】:

正如我在评论中提到的那样,快速尝试删除重复代码,这既是用于回显的字符串,也能够组织开关,以便任何具有共同值的日子都由相同的代码处理...

$today = date("D");
switch($today){
    case "Mon":
    case "Tue":
    case "Wed":
        $days = (mktime(16, 0, 0) <= time())? 2 : 1;
        break;
    case "Thu":
        $days = (mktime(16, 0, 0) <= time())? 4 : 1;
        break;
    case "Fri":
        $days = (mktime(16, 0, 0) <= time())? 5 : 4;
        break;
    case "Sat":
        $days = 4;
        break;
    case "Sun":
        $days = 3;;
        break;
    default:
        break;
}
if ( isset($days) ) {
    echo "<p>For Delivery on <strong> " . date('D jS', strtotime($Date. " + {$days} days")). "</strong><p>";
}
else    {
    echo "No information available for that day.";
}

【讨论】:

  • 这是目前给我最好的结果
【解决方案3】:

这个怎么样:

$today = date("D");
$cutoff = mktime(16, 0, 0) <= time();

$offset = $cutoff ? 2 : 1;
$offset = $cutoff and $today === 'Thu' ? 4 : 1;
$offset = $cutoff and $today === 'Fri' ? 5 : 4;
$offset = $today === 'Sat' ? 4 : $offset;
$offset = $today === 'Sun' ? 3 : $offset;

echo "<p>For Delivery on <strong> " . date('D jS', strtotime("$Date $offset days")) . "</strong><p>";

我还建议使用 Carbon 处理日期。

【讨论】:

  • 这真的很好,这是最干净的,但它要求星期四 16:00 后到 4 天,星期五 16:00 前 3 天 16:00 后 4 天
  • 我会检查结果,它会为几乎所有内容返回 3。
  • @BradHolmes 已修复。
  • @NigelRen 仅当今天等于星期日或者我错过了什么?
  • 如果不是星期天 - 如何保留 $offset 的先前值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
  • 2012-09-19
  • 2012-07-26
  • 1970-01-01
  • 2016-03-02
  • 2017-04-13
相关资源
最近更新 更多