84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
359900 人が学習中
3350 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
使えるのですが、何度見ても理解できないのですが、どなたか説明して理解していただけないでしょうか? &ここでの参照割り当てを理解するにはどうすればよいですか?
主要是引用的使用,可以简化下测试:
有引用时:
$item1= array('id' => 1, 'pid' => 0, 'name' => '安徽省'); $item2= array('id' => 2, 'pid' => 0, 'name' => '浙江省'); $item3=array('id' => 3, 'pid' => 1, 'name' => '合肥市'); $tree[] = &$item1;//注意引用 $item1['son']=&$item2;//注意引用 $item2['son']=$item3; print_r($tree);
无引用时:
$item1= array('id' => 1, 'pid' => 0, 'name' => '安徽省'); $item2= array('id' => 2, 'pid' => 0, 'name' => '浙江省'); $item3=array('id' => 3, 'pid' => 1, 'name' => '合肥市'); $tree[] = $item1;//注意无引用 $item1['son']=$item2;//注意无引用 $item2['son']=$item3; print_r($tree);
有引用时子元素的改动都会在整个数组中展示出来,而无引用时,子元素的变动对整个数组没有影响。
没人么,求解释
是这样的, foreach 括号中的 items => a 和循环体中的 items => b 在内存中存在两个地方. 使用 & 之后, b 将会指向 a 即真正的 items.
foreach
items
a
b
&
但是在 php7 之后, foreach 变了一些 => php7 foreach 不向后兼容特性
php7
引用赋值,就是说将赋值左边的直接指向内存中存储这个值的这块区域,而不是开辟一块新空间去接收数据的副本。
所以,在父子级别关系中,引用赋值直接将父元素中的['son'],直接指向了子元素的那片存储区,而并非只是存了值而已。每一个父元素都将['son']指向对应子元素的存储区,这样,其实在内存里已经连接形成了一个树形的结构,而由于所有的父元素里['son']都是指向了子元素的内存区,所以,输出数组中的父子关系和内存里的数据关系树基本上是一致的。
['son']
参考 @vishun
$items = array( 1 => array('id' => 1, 'pid' => 0, 'name' => '安徽省'), 2 => array('id' => 2, 'pid' => 0, 'name' => '浙江省'), 3 => array('id' => 3, 'pid' => 1, 'name' => '合肥市'), 4 => array('id' => 4, 'pid' => 3, 'name' => '长丰县'), 5 => array('id' => 5, 'pid' => 1, 'name' => '安庆市'), );
//&引用赋值在这儿如何理解? $items[1]['son'][] = &$items[3]; $items[3]['son'][] = &$items[2]; print_r($items[1]); //简化了结果,可以直接看son //Array //( // [id] => 1,[pid] => 0,[name] => 安徽省, // [son] => Array( // [0] => Array( // [id] => 3,[pid] => 1,[name] => 合肥市, // [son] => Array( // [0] => Array( // [id] => 2,[pid] => 0,[name] => 浙江省 // ) // ) // ) // ) //)
//无限分级函数么? function getTree($items){ $tree = array(); foreach($items as $item){ if(isset($items[$item['pid']])){//关键是看这个判断,是顶级分组就给$tree,不是的话继续拼凑子分组(结合上述&用法) $items[$item['pid']]['son'][] = &$items[$item['id']]; }else{ $tree[] = &$items[$item['id']]; } } return $tree; }
看到了以上的回答,我还是想回答一下,引用再PHP里和指针在C/C++里的用法类似,相当于操作这个变量的指针,这样子的话,在函数里操作这个引用变量也就触发本身的变量更改。引用能带来一些好处:因为是直接操作“指针”,效率很高,不会产生多余的内存浪费以及消耗开辟内存的性能;
主要是引用的使用,可以简化下测试:
有引用时:
无引用时:
有引用时子元素的改动都会在整个数组中展示出来,而无引用时,子元素的变动对整个数组没有影响。
没人么,求解释
是这样的,
foreach
括号中的items
=>a
和循环体中的items
=>b
在内存中存在两个地方. 使用&
之后,b
将会指向a
即真正的items
.但是在
php7
之后,foreach
变了一些 => php7 foreach 不向后兼容特性引用赋值,就是说将赋值左边的直接指向内存中存储这个值的这块区域,而不是开辟一块新空间去接收数据的副本。
所以,在父子级别关系中,引用赋值直接将父元素中的
['son']
,直接指向了子元素的那片存储区,而并非只是存了值而已。每一个父元素都将['son']
指向对应子元素的存储区,这样,其实在内存里已经连接形成了一个树形的结构,而由于所有的父元素里['son']
都是指向了子元素的内存区,所以,输出数组中的父子关系和内存里的数据关系树基本上是一致的。参考 @vishun
看到了以上的回答,我还是想回答一下,引用再PHP里和指针在C/C++里的用法类似,相当于操作这个变量的指针,这样子的话,在函数里操作这个引用变量也就触发本身的变量更改。
引用能带来一些好处:因为是直接操作“指针”,效率很高,不会产生多余的内存浪费以及消耗开辟内存的性能;