0
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);
冬至 70
2019-01-15 提问
1 个回答
0

已采纳

解析这个现象前先看下面的代码,看看参数 $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 变量的值

撰写答案

推广链接