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)
那么第一个三元的结果不会干扰第二个三元.
“建议您避免“堆叠”三元表达式。在单个语句中使用多个三元运算符时,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只是简单地向后倾斜。