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);
解析这个现象前先看下面的代码,看看参数
$params_1
会输出params_1
还是params_2
结果
解析
假设
$params_1
,$params_2
内容所在内存为m1
,m2
test
会生成两个局部变量$p1
,$p2
,只不过这两个局部变量相当于指针,这时$params_1
和$p1
指向m1
,$params_2
和$p2
指向m2
$p1 = 'params_1';
相当于$params_1
重新赋值, 现在m1
的值为params_1
$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
变量的值