2013-10-30 68 views
1

我只是想知道指向数组的变量变量如何处理。拿下面的代码:在PHP中由变量变量返回的数组中索引

$a = new stdClass(); 
$a->b = array('start' => 2); 
$c = 'b'; 
$d = 'start'; 
print $a->$c; // => Array 
print $a->$c['start']; // => Array 
print $a->$c[0]; // => Array 
print $a->$c[0][0]; //=> PHP Fatal error: Cannot use string offset as an array in php shell code on line 1 

我期望的第一个打印,第二个我没有,或第三个。第四次预计在认识到$ a - > $ c的评估显然是一个字符串之后。但后来为什么这项工作:

$t = $a->$c; 
print $t['start']; //=> 2 

我问了,因为我很好奇,比我更需要知道如何很好地完成

$e = 'start'; 
$a->$c[$e] 

任何人都知道我为什么不能直接索引到变量用法返回的数组?

+0

你可以在'print $ a - > $ c [0]上使用'var_dump()''确认它是数组吗? – Latheesan

回答

1

它归结为操作顺序以及如何PHP类种子队。提示:var_dump是你的朋友,echo总是强制转换为字符串,所以它是分析变量值的最差操作,尤其是在调试设置中。

考虑以下几点:

var_dump($a->$c); // array (size=1)/'start' => int 2 
var_dump($a->$c['start']); // array (size=1)/'start' => int 2 
var_dump($a->b['start']); // int 2 
var_dump($c['start']); // string 'b' (length=1) 

的这里关键是PHP如何解释的$c['start']的部分(包括$c[0]这里也)。 $c是字符串'b',并且当试图获得字符串'b的这个简单的returns the first character in the string'start'索引时,这恰好是字符串中唯一的字母(b)。您可以使用$c = 'bcdefg';进行测试 - 它会得出相同的结果(在这种特定情况下)。另外,$c['bogus']将产生与$c['start']完全相同的结果;食物的思想,并确保你做我所链接的所需的阅读。

所以考虑到这一点(明知$c['start']勉强回报'b'),表达$a->$c['start']$a->b解释。 也就是说,订单是$a->($c['start'])而不是($a->$c)['start']

不幸的是你不能使用()也不{}操纵分析器(PHP SCREAM S),所以你不能完成你想要在一个单一的线。下面的工作:

$e = 'start'; 
$interim = $a->$c; 
echo $interim[$e]; 

或者,你可以投你的数组作为对象(如果你拥有的奢侈品):

$a->$c = (object) $a->$c; // mutate 
var_dump($a->$c->$e); 

$interim = (object) $a->$c; // clone 
var_dump($interim->$e); 

...顺便说一下,指回升到$c['start']$c[0] ,关于$c[0][0]你根本不能这样做,因为$c[0]字符b在字符串'b';当访问字符/字节b时,它将不具有[0]的属性。

+0

啊,谢谢。两条路线是我最终做的。我从来没有尝试过'$ c ['start']',因为尝试以这种方式对字符串进行索引并没有什么意义,但是由于这是PHP执行操作顺序的方式,因此您为什么要指出它出。感谢您满足我的好奇心。 – EdgeCaseBerg

0

$a->$c[0];实际上等于:array('start' => 0)

所以当你做的事:

print $a->$c[0][0];

你试图在不存在指数0$a->$c[0]加载一个数组元素。

然而,这将工作:

print $a->$c[0]['start'];