这句引用代码如何理解? [ 2.0 版本 ]
在网上看到一段代码:
$items = array(
1 => array('id' => 1, 'pid' => 0, 'name' => '江西省'),
2 => array('id' => 2, 'pid' => 0, 'name' => '黑龙江省'),
3 => array('id' => 3, 'pid' => 1, 'name' => '南昌市'),
);
foreach ($items as $item) {
$items[$item['pid']]['son'][$item['id']] = &$items[$item['id']]; //这句引用不解
}
print_r(isset($items[0]['son']) ? $items[0]['son'] : array());
其结果:
Array
(
[1] => Array
(
[id] => 1
[pid] => 0
[name] => 江西省
[son] => Array
(
[3] => Array
(
[id] => 3
[pid] => 1
[name] => 南昌市
)
)
)
[2] => Array
(
[id] => 2
[pid] => 0
[name] => 黑龙江省
)
)
我也看了php引用的知识,还是不明白为什么会出现这种结果,南昌市如何跑到江西省里面的???
共 4 个回答
-
-
哥们这么理解的, 循环初期,会发现 $items['1'] 增加了一个键值对应的值 ;
[son] => Array ( [3] => Array ( [id] => 3 [pid] => 1 [name] => 南昌市 ) )
然后在新增:$items[0]['son'] 这个的时候,会发现 $items[0]['son']['1'] = $items['1];
而此时 $items['1'] 已经变成了:
[id] => 1 [pid] => 0 [name] => 江西省 [son] => Array ( [3] => Array ( [id] => 3 [pid] => 1 [name] => 南昌市 ) )
应该可以理解了一些吧?
-
foreach ($items as $item) { $items[$item['pid']]['son'][$item['id']] = &$items[$item['id']]; //这句引用不解 print_r(isset($items[0]['son']) ? $items[0]['son'] : array()); }
你可以这样打印看看。
分析如下:
我们先不看引用那个符号作用,foreach(),三次,
分析如下:$items[0]['son'][1] = array('id' => 1, 'pid' => 0, 'name' => '江西省'); $items[0]['son'][2] = array('id' => 2, 'pid' => 0, 'name' => '黑龙江省'); $items[1]['son'][3] = array('id' => 3, 'pid' => 1, 'name' => '南昌市');
这三条理解没问吧。
然后,我们看下第三次打印,引用“&”作用
$items[1]['son'][3]
再拆分先看
$items[1] ?他等于什么,
看下循环结构$items[$item['pid']]['son'][$item['id']]=&$items[$item['id']];
看到没,第一次循环分解:右边分解
&$items[$item['id']] = $items[1] = array('id' => 1, 'pid' => 0, 'name' => '江西省');
好回过头来,再看 $items[1]['son'][3]
Array ( [id] => 1 [pid] => 0 [name] => 江西省 [son] => Array ( [3] => Array ( [id] => 3 [pid] => 1 [name] => 南昌市 ) ) )
本来到这,就结束了。我再补充下
当var_dump($items[0]['son]);
再次分析下
从$items[0]['son'][1]
因为这个key对应的value的地址不正是 刚才我们操作的那块。。因为是引值。
所以,我们得到,你贴图的数组。。。 -
xyf90314
注册时间:2015-03-04
最后登录:2023-03-13
在线时长:95小时23分
最后登录:2023-03-13
在线时长:95小时23分
- 粉丝21
- 金钱5257
- 威望40
- 积分6607