2015-03-10 2 views
1

Проект Gleez написан на основе Kohana. Я использую его для изучения. У меня есть некоторые вопросы о том, как работает следующий код. Он используется для генерации дерева из заданной информации, а затем рекурсивная функция использует это сгенерированное дерево для создания структуры.Объяснение функции от проекта Gleez

я дать результата запроса $ дерево к функции, которая содержит родительский идентификатор = PID Цикл проходит через каждый пункт проверки, если PID установлено (с помощью IsSet), и если да, то добавляется пустой массив $ D [ «детей» ] к текущему элементу. Ссылка используется для изменения значения элемента в цикле foreach.

  1. Мой вопрос в том, почему ссылка используется, потому что даже если isset является ложным пустым массивом $ d ['children'] добавлен? Наверное, я просто не понимаю, как использовать эту функцию. 2.Why моей simplifyed функции без ссылки по-прежнему делает добавить $ пункта [ 'дети'], где PID = Null

    private function generate_tree($tree) 
    { 
    $menu = array(); 
    $ref = array(); 
    
    foreach($tree as $d) 
    { 
        $d['children'] = array(); 
    
        if(isset($ref[$d['plid']])) 
        { 
         // we have a reference on its parent 
         $ref[ $d['plid'] ]['children'][ $d['mlid'] ] = $d; 
         $ref[ $d['mlid'] ] =& $ref[ $d['plid'] ]['children'][ $d['mlid'] ]; 
        } 
        else 
        { 
         // we don't have a reference on its parent => put it a root level 
            $menu[$d['mlid']] = $d; 
         $ref[$d['mlid']] =& $menu[$d['mlid']]; // both pointing to the mlid 
        } 
    } 
    
    return $menu; 
    

    }

Я simplifyed функции просто добавить $ пункта [ 'дети «]; для получения $ tree, если установлен родительский идентификатор. Я передаю функции generate_tree эти параметры.

array(4){ 
     [0]=> array(2) 
      { 
      ["id"]=> string(1) "2" 
      ["pid"]=> NULL 
      } 
     [1]=> array(2) 
      { 
      ["id"]=> string(1) "3" 
      ["pid"]=> NULL 
      } 
     [2]=> array(2) 
      { 
      ["id"]=> string(1) "6" 
      ["pid"]=> string(1) "2" 
      } 
     [3]=> array(2) 
      { 
      ["id"]=> string(1) "8" 
      ["pid"]=> string(1) "3" 
      } 
    } 


    private function generate_tree($menu) { 

    $tree = array(); 


    foreach ($menu as $item) { 

     $item['children'] = array(); 

     if (isset($tree[$item['pid']])){ 
      $tree[$item['pid']['children']] = $item; 
     } 
     else{ 

      $tree[$item['pid']] = $item; 
     } 
    } 
    return $tree; 
} 

Результат: $ tree. Как вы видите ["pid"] => Null, но еще добавлен $ item ['children'].

array(3) { 
     [""]=> array(3) 
      { 
      ["id"]=> string(1) "3" 
      ["pid"]=> NULL 
      ["children"]=> array(0) { } 
      } 
     [2]=> array(3) 
      { 
      ["id"]=> string(1) "6" 
      ["pid"]=> string(1) "2" 
      ["children"]=> array(0) { } 
      } 
     [3]=> array(3) 
     { 
     ["id"]=> string(1) "8" 
     ["pid"]=> string(1) "3" 
     ["children"]=> array(0) { } 
     } 
    } 

Заранее спасибо!

+0

Вы пытались удалить ссылку и проверить, что произойдет, если вы это сделаете? Иногда лучше всего засвидетельствовать, что происходит :) –

+0

Да, я упростил код, удалил ссылку, i –

+0

Я подстегнул, чтобы исправить свой вопрос, потому что это мой первый вопрос, и я полагаю, что это не самый лучший. –

ответ

0

Когда вы выполняете операции по ссылке, вы используете одну и ту же переменную, все, что вы делаете с ней, будет анализироваться на любую другую ссылочную переменную.

Когда вы не выполнять операции по ссылке вы создаете копию переменных и все, что вы делаете, чтобы копии не будут обрабатываться любым другим скопированным переменными.

Тогда почему код написан таким образом? Это делается так, чтобы программисту не пришлось беспокоиться об обновлении массива вплоть до дерева при совпадении.

+0

При использовании ссылки. Я думаю, что не понял «все, почему вниз», вы могли бы указать мне правильный путь. –

+0

Вы можете представить массив как дерево. Дерево может иметь много филиалов и филиалов, которые могут иметь много филиалов. Вы можете перемещаться/перемещаться по ветвям, то есть идти вниз/через массив или вверх/из массива. В этом ссылочном примере программисту не нужно предпринимать никаких попыток сохранить иерархию, потому что дети являются ссылкой на родительский элемент, а его дочерние элементы ссылаются на его родительский элемент. Используя эту модель, мы можем обновить любую ветвь, состоящую из n элементов, только для того, чтобы знать ее позицию верхнего уровня. «Всю дорогу вниз» означает, что дополнительных уровней не осталось. – psycotik

+0

ваше объяснение было здорово.Но до сих пор не понимаю мой второй вопрос об упрощенном примере без ссылки. –

Смежные вопросы