递归数组搜索返回子数组的引用?

时间:2013-12-18 19:23:12

标签: php arrays recursion reference pass-by-reference

我有一个变量$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;

}

2 个答案:

答案 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将自动获取引用引用的值并存储它在一大块记忆中。