suchen

Heim  >  Fragen und Antworten  >  Hauptteil

php - Kann jemand diese unendliche hierarchische Funktion klar erklären?

Ich kann es verwenden, aber ich kann es nicht jedes Mal verstehen, wenn ich es ansehe. Kann es jemand erklären und klären? &Wie ist hier die Referenzzuordnung zu verstehen?

$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' => '安庆市'),
);
function getTree($items){
    $tree = array();
    foreach($items as $item){
        if(isset($items[$item['pid']])){
            $items[$item['pid']]['son'][] = &$items[$item['id']];
        }else{
            $tree[] = &$items[$item['id']];
        }
    }
    return $tree;
}
学习ing学习ing2749 Tage vor743

Antworte allen(6)Ich werde antworten

  • 習慣沉默

    習慣沉默2017-06-29 10:10:08

    主要是引用的使用,可以简化下测试:

    • 有引用时:

    $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);

    有引用时子元素的改动都会在整个数组中展示出来,而无引用时,子元素的变动对整个数组没有影响。

    Antwort
    0
  • 巴扎黑

    巴扎黑2017-06-29 10:10:08

    没人么,求解释

    Antwort
    0
  • 迷茫

    迷茫2017-06-29 10:10:08

    是这样的, foreach 括号中的 items => a 和循环体中的 items => b 在内存中存在两个地方. 使用 & 之后, b 将会指向 a 即真正的 items.

    但是在 php7 之后, foreach 变了一些 => php7 foreach 不向后兼容特性

    Antwort
    0
  • 世界只因有你

    世界只因有你2017-06-29 10:10:08

    引用赋值,就是说将赋值左边的直接指向内存中存储这个值的这块区域,而不是开辟一块新空间去接收数据的副本。

    所以,在父子级别关系中,引用赋值直接将父元素中的['son'],直接指向了子元素的那片存储区,而并非只是存了值而已。每一个父元素都将['son']指向对应子元素的存储区,这样,其实在内存里已经连接形成了一个树形的结构,而由于所有的父元素里['son']都是指向了子元素的内存区,所以,输出数组中的父子关系和内存里的数据关系树基本上是一致的。

    Antwort
    0
  • 世界只因有你

    世界只因有你2017-06-29 10:10:08

    参考 @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;
    }

    Antwort
    0
  • 大家讲道理

    大家讲道理2017-06-29 10:10:08

    看到了以上的回答,我还是想回答一下,引用再PHP里和指针在C/C++里的用法类似,相当于操作这个变量的指针,这样子的话,在函数里操作这个引用变量也就触发本身的变量更改。
    引用能带来一些好处:因为是直接操作“指针”,效率很高,不会产生多余的内存浪费以及消耗开辟内存的性能;

    Antwort
    0
  • StornierenAntwort