Оператор переключения PHP в дни доставки эха - PullRequest
0 голосов
/ 18 января 2019

У меня очень сложная ситуация с доставкой, когда оператор смены проверяет день недели и время отключения 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;
        }
        ?>

несомненно, они должны быть более элегантным способом достижения этого, если бы любой орган знал о более чистом способе достижения того же результата. Этот код работает, но может быть намного лучше

Ответы [ 3 ]

0 голосов
/ 18 января 2019

Обратите внимание, что вы можете сложить 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'));
0 голосов
/ 18 января 2019

Как насчет этого:

$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>";

Также я бы предложил использовать Углерод для работы с датами.

0 голосов
/ 18 января 2019

Быстрая попытка была бы, как я упоминал в комментарии, удалить повторяющийся код, это как строка, используемая для отображения, так и возможность организации переключения так, чтобы любые дни с общими значениями обрабатывались одним и тем же кодом. ...

$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.";
}
...