2016-12-24 16:07:43 1707次浏览 4条回答 0 悬赏 100 金钱

在网上看到一段代码:

$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引用的知识,还是不明白为什么会出现这种结果,南昌市如何跑到江西省里面的???

  • 回答于 2016-12-24 21:45 举报
    $items[父id(江西)]['son'][子id(南昌)] = &$items[子id(南昌)]
    

    有问题?

  • 回答于 2016-12-26 17:14 举报

    哥们这么理解的, 循环初期,会发现 $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] => 南昌市
                            )
    
                    )
    

    应该可以理解了一些吧?

  • 回答于 2016-12-27 13:46 举报
    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的地址不正是 刚才我们操作的那块。。因为是引值。
    所以,我们得到,你贴图的数组。。。

  • 回答于 2016-12-27 16:04 举报

    1482799934(1.png

您需要登录后才可以回答。登录 | 立即注册
xyf90314
副总裁

xyf90314

注册时间:2015-03-04
最后登录:2023-03-13
在线时长:95小时23分
  • 粉丝21
  • 金钱5257
  • 威望40
  • 积分6607

热门问题