【发布时间】:2014-01-07 03:13:45
【问题描述】:
我有一个变量,$nav。
我有一个函数将返回$nav 的子数组。
我想编辑这个子数组作为对$nav的引用。
这是我用来执行此操作的代码,并带有一些测试代码以查看引用是否有效:
$group =& $this->find($parent, $this->nav);
$group['group'] = 'group'; // NOT a reference
private function find($needle, &$haystack) {
$haystack['haystack'] = 'haystack'; // still a reference
foreach ($haystack as &$sel) {
$sel['sel'] = 'sel'; // BOTH a reference and not??
if ($sel['link']->getSlug() == $needle)
return $sel;
}
}
这里是 var 转储:
$group转储:
Array
(
[link] => Link Object
(
[text:Link:private] => root
[slug:Link:private] => root
[url:Link:private] => /root
)
[sel] => sel
[group] => group
)
$nav转储:
Array
(
[0] => Array
(
[link] => Link Object
(
[text:Link:private] => root
[slug:Link:private] => root
[url:Link:private] => /root
)
[sel] => sel
)
[haystack] => haystack
)
为数组设置测试值表明操作$haystack 正在影响对$nav 的引用。在 foreach 循环中编辑 $sel 变量既是引用又不是引用(为什么?)。编辑$group变量显示引用没有通过。
回答
为了让它工作,我需要将 foreach 变量设置为一个引用,并在函数find() 中声明一个返回引用。这是正确的代码:
$group =& $this->find($parent, $this->nav);
// edit `$group` here, which will edit
// the returned reference of the sub-array of `$this->nav`
private function &find($needle, &$haystack) {
foreach ($haystack as &$sel) {
if ($sel['link']->getSlug() == $needle)
return $sel;
}
【问题讨论】:
-
你有没有一个例子说明你的数组
$nav/$group在函数之前和之后应该是什么样子?一旦在你的函数中,我看不到你在哪里实际作用于任何变量。我也不明白为什么需要通过引用传入数组。您始终可以对函数中的数组进行操作,然后在完成后返回被操作的数组。也许我不明白你到底想做什么。 -
当然,我将编辑我的帖子以显示我要对数组执行的操作。
-
出于好奇,如果
$group给了你想要的东西,是不是有什么原因你不能用?? -
如果我能把它轻松放入
$nav,我完全可以接受。但我希望它有无限数量的子阵列。所以我不确定如何找到在哪里弹出$group。 -
明白了。到目前为止,我可以告诉您的一件事是,要通过引用进行分配,您需要将 & 符号与赋值运算符一起使用。
$group = &$this->find($parent, $this->nav);应该是$group =& $this->find($parent, $this->nav);
标签: php arrays recursion reference pass-by-reference