2 Stimmen

Effizienter Weg zur Ermittlung der Anzahl der Schritte zwischen den Array-Werten

Angenommen, Sie haben ein Array, das die Wochentage repräsentiert, an denen ein Geschäft geöffnet ist, basierend auf PHPs date('w') etwa so:

$open = array(1,3,4); // open on mon/wed/thu
$week = array(0,1,2,3,4,5,6); // full week of days according to date('w')

und Sie haben den aktuellen Tag date('w') (z.B. 6 für Samstag) - wie kann man die Anzahl der Tage/Schritte bis zum nächsten Tag der offenen Tür am effizientesten berechnen?

1voto

Paul Dixon Punkte 286600

Hier ist eine einfache Möglichkeit: Suchen Sie einfach den nächsten freien Tag:

$daysUntilOpen=0;
while (!in_array($day, $open))
{
   $day=($day+1)%7;
   $daysUntilOpen++;
}

Wenn Sie viele Abfragen durchführen, können Sie ein Array erstellen, das Ihnen die Tage bis zur Öffnungszeit für jeden Tag anzeigt, z. B.

$daysUntilOpenLookup=array();
foreach($week as $day)
{
    $daysUntilOpen=0;
    while (!in_array($day, $open))
    {
       $day=($day+1)%7;
       $daysUntilOpen++;
    }

    $daysUntilOpenLookup[$day]=$daysUntilOpen;
}

Jetzt können Sie ganz einfach herausfinden, wie viele Tage es noch bis zur Eröffnung sind

$daysUntilOpen=$daysUntilOpenLookup[$day];

1voto

Gumbo Punkte 617646

Für höchstens sieben Werte auf $open können Sie eine einfache lineare Suche durchführen:

$nextWeekdayOpen = null;
$daysUntilNextOpen = null;
$currentWeekday = date('w');
foreach ($open as $weekday) {
    if ($weekday >= $currentWeekday) {
        $nextWeekdayOpen = $weekday;
        break;
    }
}
if (is_null($nextWeekdayOpen) && !empty($open)) {
    $nextWeekdayOpen = $open[0];
}
if (!is_null($nextWeekdayOpen)) {
    $daysUntilNextOpen = ($nextWeekdayOpen > $currentWeekday) ? $nextWeekdayOpen-$currentWeekday : 6-$currentWeekday+$nextWeekdayOpen;
}

Dabei werden einfach die offenen Wochentage durchlaufen und der erste gesucht, der gleich (d. h. heute offen) oder größer als der aktuelle Wochentag ist. Wenn es keinen gibt, wird der erste offene Wochentag genommen (vorausgesetzt, die offenen Wochentage sind sortiert). Schließlich werden die Tage zwischen dem nächsten offenen Wochentag und dem aktuellen Wochentag berechnet.

Dieser Algorithmus läuft in linearer Zeitkomplexität.

1voto

Nin Punkte 2947

Ich bin mir nicht sicher, ob Effizienz hier wirklich ein Thema ist, da die Anzahl der Gegenstände gering ist:

for($i=1;$i<7;$i++) {
if (in_array((($day+$i)%7), $open)) break;
}

echo "Next open day in $i days";

0voto

Luke Punkte 21388

So würde ich es machen, indem ich die sehr hilfreiche Funktion strtotime() verwende. Es ist auch sehr klar, wie es funktioniert.

<?php
// Get the current timestamp for comparison
$now = time();

// Get unix timestamps for each open day relative to comparison time $now
$monday = strtotime("next monday", $now);
$tuesday = strtotime("next wednesday", $now);
$thursday = strtotime("next thursday", $now);

// Put values in to array
$days_open = array($monday, $tuesday, $thursday);

// See which unix timestamp is least (the nearest to current day)
$nearest_day = min($days_open);

// Then you can get difference in days
$days_difference =  date('w', $nearest_day) - date('w', $now);

// You can show the difference like this
echo "We're next open in " , $days_difference , " days";
?>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X