请看这份深度优先搜索代码,为何用引用就找不到?

冬至
  • 81
function search(&$node, &$forest, $id)
{
    $node = null;
    $len = count($forest);
    for ($i=0; $i<$len; ++$i)
    {
        if ($forest[$i]['id'] == $id)
        {
            $node = &$forest[$i]; //【去掉“&”就能找到,加上就找不到】
            return;
        }

        search($node, $forest[$i]['children'], $id);
        if ($node) { return; }
    }
}

$forest = array(
    array(
        'id' => 1,
        'pid' => 0,
        'children' => array(
            array(
                'id' => 11,
                'pid' => 1,
                'children' => array(),
            ),
        ),
    ),
    array(
        'id' => 2,
        'pid' => 0,
        'children' => array(),
    ),
);

search($node, $forest, 11);
echo json_encode($node);
回复
阅读 666
1 个回答
✓ 已被采纳

解析这个现象前先看下面的代码,看看参数 $params_1 会输出 params_1 还是 params_2

function test(&$p1, &$p2)
{
    $p1 = 'params_1';
    $p1 = &$p2;
}
$params_2 = 'params_2';
test($params_1, $params_2);
echo $params_1;

结果

params_1

解析

假设 $params_1, $params_2 内容所在内存为 m1, m2

  1. 执行函数 test 会生成两个局部变量 $p1, $p2,只不过这两个局部变量相当于指针,这时 $params_1$p1 指向 m1, $params_2$p2 指向 m2
  2. $p1 = 'params_1'; 相当于 $params_1 重新赋值, 现在 m1 的值为 params_1
  3. $p1 = &$p2; 相当于 $p1 指向内存 m2, 这时 $params_1 指向 m1, $params_2, $p1, $p2 指向 m2,m1 的值为还是 params_1,所以打印$params_1的值就是 params_1

题主问题

题主问题可以用以上解析解答, $node = &$forest[$i]; 这个代码改变了 $node 这个局部变量的指向(没有赋值操作),没有改变 search($node, $forest, 11); 这句代码里 $node 变量的值

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏