双引号嵌套数组不起作用
Double quoted nested array won't work
考虑一下:
$a = 'u';
$b[$a] = 'v';
$c[$b[$a]] = 'w';
这很好用:
php > echo $c[$b[$a]];
w
这也有效:
php > echo '$c[$b[$a]]';
'$c[$b[$a]]'
但是这会导致语法错误:
php > echo "$c[$b[$a]]";
PHP Parse error: syntax error, unexpected '[', expecting ']'
虽然较短的版本有效:
php > echo "$b[$a]";
v
为什么?
简短的回答是:不要这样写 PHP!如果阅读起来很混乱,请使用中间变量。
但是,它可以修复:看起来 PHP 只需要变量最外边缘的大括号分隔符:
<?php
$a = 'u';
$b[$a] = 'v';
$c[$b[$a]] = 'w';
echo "{$c[$b[$a]]}";
这个也可以:
echo "${c[$b[$a]]}";
在第一种情况下,整个事情都用大括号括起来,在第二种情况下,$
允许在大括号结构之外表示下一位是变量。
在double quoted string there are two kinds of variable parsing里,简单又复杂。简单解析仅适用于一维数组或对象。所以这些会起作用:
echo "Valid: $foo[1]";
echo "Valid: $foo[bar]";
echo "Valid: $foo->bar";
但这些不会:
echo "Invalid: $foo[1][2]";
echo "Invalid: $foo->bar->baz";
echo "Invalid: $foo->bar()[2]";
复杂的解析是 halfer 在他的回答中建议的,它将表达式用花括号括起来,确实可以解决您的问题:
echo "Valid: ${foo[1][2]}";
echo "Valid: ${foo->bar->baz}";
echo "Valid: ${foo->bar()[2]}";
考虑一下:
$a = 'u';
$b[$a] = 'v';
$c[$b[$a]] = 'w';
这很好用:
php > echo $c[$b[$a]];
w
这也有效:
php > echo '$c[$b[$a]]';
'$c[$b[$a]]'
但是这会导致语法错误:
php > echo "$c[$b[$a]]";
PHP Parse error: syntax error, unexpected '[', expecting ']'
虽然较短的版本有效:
php > echo "$b[$a]";
v
为什么?
简短的回答是:不要这样写 PHP!如果阅读起来很混乱,请使用中间变量。
但是,它可以修复:看起来 PHP 只需要变量最外边缘的大括号分隔符:
<?php
$a = 'u';
$b[$a] = 'v';
$c[$b[$a]] = 'w';
echo "{$c[$b[$a]]}";
这个也可以:
echo "${c[$b[$a]]}";
在第一种情况下,整个事情都用大括号括起来,在第二种情况下,$
允许在大括号结构之外表示下一位是变量。
在double quoted string there are two kinds of variable parsing里,简单又复杂。简单解析仅适用于一维数组或对象。所以这些会起作用:
echo "Valid: $foo[1]";
echo "Valid: $foo[bar]";
echo "Valid: $foo->bar";
但这些不会:
echo "Invalid: $foo[1][2]";
echo "Invalid: $foo->bar->baz";
echo "Invalid: $foo->bar()[2]";
复杂的解析是 halfer 在他的回答中建议的,它将表达式用花括号括起来,确实可以解决您的问题:
echo "Valid: ${foo[1][2]}";
echo "Valid: ${foo->bar->baz}";
echo "Valid: ${foo->bar()[2]}";