Ich habe eine sehr komplizierte Liefersituation mit einer Umschaltanweisung, die den Wochentag und eine Sperrzeit von 16:00 Uhr täglich überprüft und den Liefertag wiedergibt, der am Montag, Dienstag und Mittwoch der heutige Tag + 1 Tag ist, wenn die Post abgeschnitten ist Es sollte das heutige Datum + 2 wiedergeben. Donnerstag und Freitag haben völlig unterschiedliche Liefertage, da an Wochenenden keine Lieferung erfolgt

<?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;
        }
        ?>

Sicherlich müssen sie ein eleganterer Weg sein, um dies zu erreichen. Würde jeder Körper einen saubereren Weg kennen, um das gleiche Ergebnis zu erzielen? Dieser Code funktioniert, könnte aber viel besser und kürzer sein

0
Brad Holmes 18 Jän. 2019 im 19:01

3 Antworten

Beste Antwort

Ein schneller Versuch wäre, wie ich im Kommentar erwähnt habe, den sich wiederholenden Code zu entfernen. Dies ist sowohl die Zeichenfolge, die zum Echo verwendet wird, als auch die Möglichkeit, den Switch so zu organisieren, dass alle Tage mit gemeinsamen Werten alle von demselben Code verarbeitet werden ...

$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.";
}
1
Nigel Ren 18 Jän. 2019 im 16:14

Beachten Sie, dass Sie case Übereinstimmungen stapeln können, die dasselbe tun:

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

Sie sollten jedoch nur ein kleines Array erstellen, das die Werte enthält, die Sie für die Tage benötigen, und dann den heutigen Wert nachschlagen, indem Sie den Tagesnamen als Array-Index verwenden:

$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],
];

Der Code zur Berechnung der Vorlaufzeit besteht dann nur aus einer Zeile:

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

Schließen Sie es dann wie zuvor an Ihren Ausgang an:

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

Wenn Sie jetzt die Vorlaufzeiten ändern möchten, müssen Sie keine Codierung mehr bearbeiten. Passen Sie einfach den Wert im Array an.

Und weil es schon eine Weile her ist, dass ich Code-Golf gespielt habe, ist hier das Ganze in einer einzigen Zeile:

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'));
2
Alex Howansky 18 Jän. 2019 im 22:04

Wie wäre es damit:

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

Außerdem würde ich vorschlagen, Carbon für die Arbeit mit Daten zu verwenden.

0
Archie 18 Jän. 2019 im 17:05