通过谷歌搜索(以及我的个人经验),我发现在PHP中,当一个数组元素被从同一行的函数调用中返回时,你无法获取它。例如,你不能这样做:
echo getArray()[0];
然而,我发现了一个很棒的小技巧:
echo ${!${false}=getArray()}[0];
它实际上是起作用的。问题是,我不知道它为什么起作用。如果有人能够解释一下,那就太好了。
谢谢。
echo ${!${false}=getArray()}[0];
以下是详细的步骤说明:
${false}=getArray()
将getArray的结果分配给一个空名称的变量(可以使用''或null代替false)
!${false}=getArray()
将上述值取反,转换为布尔值false
${!${false}=getArray()}
将先前(false)的值转换为(空)字符串,并使用此字符串作为变量名。也就是说,这是步骤1中的变量,等于getArray的结果。
${!${false}=getArray()}[0];
获取那个“空”变量的索引,然后返回数组元素。
同样思路的更多变体
echo ${1|${1}=getArray()}[1];
echo ${''.$Array=getArray()}[1];
function p(&$a, $b) { $a = $b; return '_'; }
echo ${p($_, getArray())}[1];
为什么getArray()[0]
无法工作,原因是PHP团队不知道如何让它工作。
它能够工作是因为你使用大括号将值转换为变量,这里有一个例子。
$hello = 'test';
echo ${"hello"};
为什么需要这个,如果您想将字符串或返回值转换为变量,就需要这个。例如:
${$_GET['var']} = true;
这是不好的做法,我认为绝不能使用。
如果您希望直接运行函数,应该使用对象,例如:
function test()
{
$object = new stdClass();
$object->name = 'Robert';
return $object;
}
echo test()->name;
function theArray() {
return range(1, 10);
}
echo theArray()[0];
// PHP 5.4+: 1
// PHP -5.4: null