2016-07-10 55 views
0

Ich bin ein Neuling sowohl in PHP und Codeigniter.PHP minus eine Woche Sonntag

Ich habe eine Funktion, die verwendet wird, um die x-Achse eines Diagramms der wöchentlichen Summen von Kilometern auf einem Fahrrad zu beschriften. Es funktioniert (oder soll funktionieren), indem man vom heutigen Datum entweder Null Sonntag oder 1, 2, 3 usw. zurückzählt, wie es von einem Array passiert wird.

Ich bin mit PHP Version 5.6.19, und dies ist mein Code:

Im Modell:

public function week_start($date, $counter){ 
     $tstring = strtotime($date); 
     $wknumber = ($counter + 1); 
     $start = strtotime("-$wknumber weeks sunday", $tstring); 
    return array(date('M d', $start));} 

Im Controller:

$datenumbers = array(0, 1, 2, 3, 4, 5, 6, 7); 
$dateResult = $this->bike_model->week_start(date("Y/m/d"), $datenumber); 

Nach Ansicht:

  for ($i = 0; $i < 8; $i++){ 
      echo "<text class = \"axis\" y = \"357\" x = \""; 
      echo 26 + ($i*70); 
      echo "\" dy = \".35em\">"; 
      echo $dates_for_table[$i];} 

Ich habe es aufgelegt seit ein paar Tagen und es hat Sonntag 3. Juli als erste Nummer auf meiner x-axis gezeigt, wie es sein sollte. Aber heute ist Sonntag, und ich erwarte, dass Sonntag, der 10. Juli, meine letzte Woche ist. Allerdings zeigt es sich immer noch letzten Sonntag!

Also meine Frage ist, gibt es hier einen Fehler oder bin ich Missverständnis, wie '- eine Woche Sonntag' sollte funktionieren?

Mein Ziel ist es, meine Funktion mit Null zu haben, da das Argument den letzten Wochenstart zurückgibt - entweder der aktuelle Sonntag, wenn Sonntag ist oder der vergangene Sonntag. Ich habe einen Workaround gefunden, indem ich ein if else zur Funktionsüberprüfung addiere, wenn es Sonntag ist.

if ($tstring == strtotime('this Sunday')){ 
    $wknumber = $counter;} 

else{ 
$wknumber = ($counter + 1);} 

Allerdings fühlt sich das klobig an und ich suche einen eleganteren Weg. Ich möchte auch verstehen, was mit "- einer Woche Sonntag" schief gelaufen ist, seit ich dachte, ich hätte verstanden, wie es funktioniert.

Vielen Dank!

+0

Ich sehe Ihren alten Code hatte '$ = Start (Datum ('w', $ TString) == 0)? $ tstring: strtotime ('letzter Sonntag', $ tstring); '. War das nicht Ihr Problem gelöst? – codisfy

+0

Dieser Code war etwas, was ich ausprobierte, aber es endete damit, dass ich den aktuellen Sonntag über die gesamte x-Achse erhielt. Ich hatte diesen Code in Notizen in meinem Modell gelassen, um mehr über die Implementierung nachzudenken. – Cyclist

+0

Ich habe gerade diesen alternativen Code erneut ausprobiert. Im Grunde war das Problem, dass es überprüft hat, ob es Sonntag war (ja!) Und wenn ja, das heutige Datum für jeden Wert im Array zurückgibt. Der einzige Weg, um eine Woche früher an jedem Punkt auf der Achse zu kommen, war die if/else-Anweisung am Ende der ursprünglichen Frage. Ich lasse diese Frage offen, auch wenn mein Code * jetzt scheint * zu funktionieren, weil mir immer noch nicht klar ist, was genau der "- $ i Wochen Sonntag" genau macht. Gibt es Ihnen den vorherigen Sonntag an jedem Tag außer Sonntag, in welchem ​​Fall es Ihnen den aktuellen Sonntag gibt? – Cyclist

Antwort

0

Hier ist, wie habe ich etwas ähnlich der objektorientierten Datetime-Stil mit:

$startDate = new DateTime('NOW'); // can pass date string if not today 

# reset start date to last Sunday or today if it is Sunday: 
$startDate->sub(new DateInterval('P'.($startDate->format('w')).'D')); 

# for debugging, output first Sunday: 
echo $startDate->format('Y-m-d H:i:s') . " => full date and time (check for timezone issues) \n\n"; 

$weeks = 8; 
for ($i = 0; $i < $weeks; $i++) { 
    # don't decrement first pass; sub 1 week on subsequent: 
    $startDate->sub(new DateInterval('P'. (($i) ? 1 : 0) .'W')); 
    echo $startDate->format('Y-m-d') . "\n"; 
}; 

Sie sollten für Ihre Zwecke anpassen können.

Wenn Sie Lust bekommen möchten, können Sie auch DatePeriod anstelle sub der Verwendung in einer Schleife:

$period = new DatePeriod(
    $startDate, 
    DateInterval::createFromDateString('-1 week'), 
    7 
); 
foreach ($period as $date) { 
    echo $date->format('Y-m-d') . "\n"; 
} 
+0

Vielen Dank für Ihren Code @ldg. Für einige meiner Charts sieht das sehr vielversprechend aus. Als Neuling verstehe ich den objektorientierten Date-Time-Stil jedoch nicht.Was bedeutet es, wenn Sie neues Datetime und neues DateInterval sagen? Ich hatte so etwas im [PHP-Handbuch] (http://php.net/manual/en/datetime.construct.php) gesehen, konnte es aber nicht herausfinden. Ich bin jetzt in Frankreich, also muss ich ins Bett gehen, aber ich werde sehen, ob ich mein Gehirn morgens damit einwickeln kann. Vielen Dank! – Cyclist

+0

@Cyclist es ist sehr ähnlich zu den Verfahren syle, siehe http://php.net/manual/en/class.datetime.php und http://www.phptherightway.com/#date_and_time – ldg

+0

Vielen Dank! Die PHP Right Way Seite ist sehr klar geschrieben ... Ich war vorher nicht dort gewesen, also danke dafür. Und danke für die zusätzliche Idee von DatePeriod. Dies und Ihre ursprüngliche Funktion wird sehr nützlich sein, da mein Projekt viele Datumsperioden beinhaltet. – Cyclist