条件三元运算符故障(PHP)

时间:2016-07-02 15:26:11

标签: php ternary-operator

我已经构建了一个函数来将这样的isDefault日期更改为Y-m-d这种格式:2016-07-02

代码

July 2nd

该功能按预期工作,但有一个问题。 // 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"; } 的第一个条件三元运算符会以$subscript"rd"结尾的每个数字返回1

示例:

2

我该如何解决?

3 个答案:

答案 0 :(得分:4)

Documentation读到:

  

注意:建议您避免“堆叠”三元表达式。   PHP在一个中使用多个三元运算符时的行为   单一陈述不明显:

<?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.
?>

答案 1 :(得分:2)

不是你问题的直接答案,但如果你只需要像你的例子那样需要英语,你可以使用php的标准date函数:

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

输出:

  

1月1日

查看working example here

答案 2 :(得分:2)

这是因为 PHP使三元运算符错误 - 它是left-associative而不是right-associative of C, Java and so forth。因此,在将C代码转换为PHP时,必须将“true”和“false”表达式括起来。