嵌套三元语句

c4r*_*t3r 9 php if-statement ternary-operator

我想知道为什么这很奇怪.我知道区别在于分组,但相比之下它是否重要?

$i = 0;
foreach ($items as $item) {
   echo ($i == 0) ? 'first_row' : ($i == sizeof($feedbacks)-2) ? 'last_row' : 'none';
   $i++;
}
Run Code Online (Sandbox Code Playgroud)

回报

last_row
none
none
last_row
Run Code Online (Sandbox Code Playgroud)

$i = 0;
foreach ($items as $item) {
   echo ($i == 0) ? 'first_row' : (($i == sizeof($feedbacks)-2) ? 'last_row' : 'none');
   $i++;
}
Run Code Online (Sandbox Code Playgroud)

正确地返回它

first_row
none
none
last_row
Run Code Online (Sandbox Code Playgroud)

为什么会有区别?

web*_*ave 14

要根据您的代码使用解释,缩小版本将是:

for ($i=0; $i<5; $i++) {
   echo $i == 0 ? 'first_row' : $i == 4 ? 'last_row' : 'none';
}
Run Code Online (Sandbox Code Playgroud)

在PHP中,这相当于编写:

for ($i=0; $i<5; $i++) {
   echo ($i == 0 ? 'first_row' : $i == 4) ? 'last_row' : 'none';
}
Run Code Online (Sandbox Code Playgroud)

在第一个去,$i有值0,所以第一个三元返回,'first_row'并且该字符串用作第二个三元的条件 - 在布尔上下文中求值true- 因此'last_row'返回.

如果你重新组合它:

for ($i=0; $i<5; $i++) {
   echo $i == 0 ? 'first_row' : ($i == 4 ? 'last_row' : 'none');
}
Run Code Online (Sandbox Code Playgroud)

那么第一个三元的结果不会干扰第二个三元.


Ilm*_*nen 5

官方的PHP文档中

“建议您避免“堆叠”三元表达式。在单个语句中使用多个三元运算符时,PHP的行为不明显。”

显然,即使PHP的三元运算符(以及它的大部分语法)都基于C,由于某种原因,PHP决定使其左向关联,而在C和基于该语言的大多数其他语言中,三元运算符却是向右关联的

C:

$ cat /tmp/foo.c
#include <stdio.h>
void main (void) { printf("%s\n", ( 1 ? "foo" : 0 ? "bar" : "baz" ) ); }

$ gcc -o /tmp/foo /tmp/foo.c; /tmp/foo
foo
Run Code Online (Sandbox Code Playgroud)

Perl:

$ perl -e 'print ( 1 ? "foo" : 0 ? "bar" : "baz" ) . "\n";'
foo
Run Code Online (Sandbox Code Playgroud)

Java:

$ cat /tmp/foo.java
public class foo { public static void main(String[] args) {
    System.out.println( ( true ? "foo" : false ? "bar" : "baz" ) );
} }

$ javac -d /tmp /tmp/foo.java; java -cp /tmp foo
foo
Run Code Online (Sandbox Code Playgroud)

JavaScript:

$ cat /tmp/foo.js
print( 1 ? "foo" : 0 ? "bar" : "baz" );

$ rhino -f /tmp/foo.js
foo
Run Code Online (Sandbox Code Playgroud)

PHP:

$ php -r 'echo ( 1 ? "foo" : 0 ? "bar" : "baz" ) . "\n";'
bar
Run Code Online (Sandbox Code Playgroud)

所以,是的,我想我们可以肯定地说,在这方面,PHP只是简单地向后倾斜。