2016-07-02 15 views
0

Ich habe eine Funktion zum Ändern einer gegebenen Y-m-d Datum wie folgt aufgebaut: 2016-07-02 zu diesem Format: July 2nd.Bedingte ternäre Operator Fehlfunktionen (PHP)

Der Code:

// Format the given Y-M-D date 
function format_date($date) { 
    // Parse the date 
    list($year, $month, $day) = array_values(date_parse($date)); 

    // Give the appropriate subscript to the day number 
    $last_char = substr($day, -1); 
    $pre_last_char = (strlen($day) > 1) ? substr($day, -2, -1) : null; 
    $subscript = ($last_char === "1") ? "st" : 
       ($last_char === "2") ? "nd" : 
       ($last_char === "3") ? "rd" : "th"; 
    $subscript = ($pre_last_char === "1") ? "th" : $subscript; 
    $day .= $subscript; 

    // Get the month's name based on its number 
    $months = [ 
     "1" => "January", 
     "2" => "February", 
     "3" => "March", 
     "4" => "April", 
     "5" => "May", 
     "6" => "June", 
     "7" => "July", 
     "8" => "August", 
     "9" => "September", 
     "10" => "October", 
     "11" => "November", 
     "12" => "December" 
    ]; 
    $month = $months[$month]; 

    // Omit the year if it's this year and assemble the date 
    return $date = ($year === date("Y")) ? "$month $day $year" : "$month $day"; 
} 

Die Funktion arbeitet wie erwartet, aber es gibt einen Haken. Der erste Bedingungs-Ternäroperator für $subscript gibt "rd" für jede Nummer zurück, die in 1 und 2 endet.

Beispiel:

echo format_date("2016-01-01"); // It will output January 1rd 

Wie kann ich das Problem lösen?

+0

Verwenden Sie ['daysuf'] (http://php.net/manual/en/datetime.formats.date.php) –

+1

Mögliches Duplikat von [ternärer PHP-Operator funktioniert nicht wie erwartet] (http: // stackoverflow. com/questions/14214427/php-ternary-operator-nicht-arbeiten-wie erwartet) –

+1

Wenn Sie nur Ihren Code reparieren möchten, [schauen Sie] (https://eval.in/599572). Überprüfen Sie die One-Line-Version für bessere Visualisierungen auf, wo ich geöffnet/geschlossen (und). – FirstOne

Antwort

4

Documentation liest:

Hinweis: Es wird empfohlen, dass Sie "Stapeln" ternäre Ausdrücke zu vermeiden. PHP-Verhalten, wenn mehr als ein ternären Operator in einer einzigen Anweisung ist nicht offensichtlich:

<?php 
// on first glance, the following appears to output 'true' 
echo (true?'true':false?'t':'f'); 

// however, the actual output of the above is 't' 
// this is because ternary expressions are evaluated from left to right 

// the following is a more obvious version of the same code as above 
echo ((true ? 'true' : false) ? 't' : 'f'); 

// here, you can see that the first expression is evaluated to 'true', which 
// in turn evaluates to (bool)true, thus returning the true branch of the 
// second ternary expression. 
?> 
+0

Alex, danke für die Details, die du in deine Antwort geschrieben hast. Es scheint, dass ich wieder in dieselbe Falle gefallen bin, indem ich nicht richtig geklammert habe. Ich habe deinen Vorschlag ausprobiert und es hat sehr gut funktioniert! –

2

keine direkte Antwort auf Ihre Frage, aber wenn Sie nur Englisch benötigen, wie in Ihrem Beispiel, können Sie PHP-Standard date Funktionen nutzen:

echo date('F jS', strtotime('2016-01-01')); 

Ausgang:

1. Januar

Siehe a working example here.

+1

Danke @jeroen. Ich kannte diese Funktion nicht. Upvoted! –

2

Dies liegt daran, PHP den ternären Operator falsch bekam - es ist left-associative statt die right-associative of C, Java and so forth. Wenn Sie also C-Code in PHP konvertieren, müssen Sie die Ausdrücke "true" und "false" in Klammern setzen.

+0

Vielen Dank für die Links @Antti. –

Verwandte Themen