我有一个变量$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
变量表明该引用未通过。
的 ANSWER 的
为了使其工作,我需要将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;
}
答案 0 :(得分:0)
原谅我,我仍然有点困惑你到底想要达到的目标。但是,看一下你的代码,你传递的是$this->nav
作为参考(看起来很精彩和花花公子),但在你的函数中,我看不到$this->nav
(现在$haystack
)的实际位置被操纵。同样在foreach
循环中,您正在使用的值需要作为引用传递,以便对其进行操作。
所以你现在的代码是:
private function find($needle, &$haystack) { //$haystack points to $this->nav
foreach ($haystack as $sel) { //$sel is a copy of the value in $this->nav not a reference
if (isset($sel['sub']))
$this->find($needle, $sel['sub']);
if ($sel['link']->getSlug() == $needle)
return $sel;
}
}
因此,您的$this->nav
数组实际上根本没有受到操纵。如果您修改foreach
以使用参考,那么可以帮助。
foreach($haystack as &$sel)
这会导致$sel
引用$haystack
中的实际值(而不是复制它),因为$haystack
已经是应工作的引用使用$this->nav
变量。
如果事情变得太模糊,你可能希望稍微重新考虑一下你的实施。
答案 1 :(得分:0)
听起来你想要做的是存储对$ nav数组元素的引用。如果是这种情况,那么这应该有效:
private function find($needle, &$haystack) {
foreach ($haystack as &$sel) {
if (isset($sel['sub']))
$this->find($needle, $sel['sub']);
if ($sel['link']->getSlug() == $needle)
return &$sel;
}
}
你需要通过引用传递你想要的数组,然后在foreach中指定元素是引用,然后返回对该元素的引用,否则php将自动获取引用引用的值并存储它在一大块记忆中。