双引号嵌套数组不起作用

时间:2016-05-17 10:08:32

标签: php syntax-error

考虑一下:

$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错误:语法错误,意外'[',期待']'

虽然较短的版本有效:

php > echo "$b[$a]";
v

为什么?

2 个答案:

答案 0 :(得分:3)

简短的回答是:不要像这样写PHP!如果阅读困惑则使用中间变量。

但是,它可以修复:看起来PHP只是想在变量的最外边缘使用大括号分隔符:

<?php
$a = 'u';
$b[$a] = 'v';
$c[$b[$a]] = 'w';

echo "{$c[$b[$a]]}";

这也很好:

echo "${c[$b[$a]]}";

在第一种情况下,整个事物用大括号括起来,而在第二种情况下,$被允许在大括号构造之外,以说下一位是一个变量。

答案 1 :(得分:3)

double quoted string中有两种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]}";