2009-10-29 2 views
0

Я работаю над сайтом, использующим двоичную систему mlm.Рекурсивно сортировать массив до уровней

Illustration here

Так у меня есть две таблицы в базе данных, пользователи Anad отношений. В пользователях есть идентификаторы и столбцы персональных данных. Отношения имеют 4 столбца: ID, parentID, childID, pos. Где pos находится либо влево, либо вправо.

Я успешно написал функцию, которая рекурсивно перечисляет все дочерние элементы данного pid (parentID). Однако мне нужно сортировать его по уровням (для отображения и расчета).

У меня есть массив детей пользователя ID = 1:

Array 
(
    [0] => Array 
     (
      [id] => 2 
      [parentID] => 1 
      [pos] => l 
     ) 

    [1] => Array 
     (
      [id] => 4 
      [parentID] => 2 
      [pos] => l 
     ) 

    [2] => Array 
     (
      [id] => 8 
      [parentID] => 4 
      [pos] => l 
     ) 

    [3] => Array 
     (
      [id] => 5 
      [parentID] => 2 
      [pos] => p 
     ) 

    [4] => Array 
     (
      [id] => 3 
      [parentID] => 1 
      [pos] => p 
     ) 

    [5] => Array 
     (
      [id] => 6 
      [parentID] => 3 
      [pos] => l 
     ) 

    [6] => Array 
     (
      [id] => 7 
      [parentID] => 3 
      [pos] => p 
     ) 

) 

Теперь у меня есть функция с именем get_levels, который возвращает многомерный массив, который должен выглядеть следующим образом:

Array 
(
    [0] => Array 
     (
      [0] => Array 
       (
        [id] => 2 
        [parentID] => 1 
        [pos] => l 
       ) 

      [1] => Array 
       (
        [id] => 3 
        [parentID] => 1 
        [pos] => p 
       ) 

     ) 
    [1] => Array 
     (
      [0] => Array 
       (
        [id] => 4 
        [parentID] => 2 
        [pos] => l 
       ) 

      [1] => Array 
       (
        [id] => 5 
        [parentID] => 2 
        [pos] => p 
       ) 
      [2] => Array 
       (
        [id] => 6 
        [parentID] => 3 
        [pos] => l 
       ) 

      [3] => Array 
       (
        [id] => 7 
        [parentID] => 3 
        [pos] => p 
       ) 

     ) 
    ETC. 

) 

Вот функция:

function get_levels($pid,$level, $level_id){ 
     $children = children_array($pid,1); 
     if (sizeof($children) > 0): 
      foreach ($children as $child): 
      if ($child["parentID"] == $pid): 


       get_levels($child["id"], $level, $level_id+1); 
       $level[$level_id][] = $child;   


     endif; 


     endforeach; 
     endif; 
     return $level; 
} 

функция chi ldren_array ($ pid, $ depth) возвращает детей ... для $ depth = 1 возвращает немедленных детей (0 или 1 или 2), для $ depth = 0 возвращает всех детей

Может ли кто-нибудь помочь мне с этим функционировать? Я думаю, что функция работает, однако Я не знаю, как рекурсивно использовать и добавлять в массив.

ответ

0

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

При использовании дерева я бы использовал что-то вроде класса Node, у которого есть двое детей слева и справа. Итерация через дерево будет куском пирога, вставка/удаление/редактирование в нее легко выполняется в зависимости от того, какой набор правил вы хотите соблюдать. При хранении дерева я бы использовал какой-то Ahnentafel list, который можно легко сделать в реляционной базе данных.

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

+1

Я нашел этот двоичный класс дерева: http://www.phpclasses.org/browse/file/11713.html Каким должен быть лучший способ хранения данных в базе данных? ID | parentID | leftChildID | rightChildID? – Smaug

+0

Для данных я хотел бы ссылаться только на родителя и может занимать позицию, если нет другого способа понять это. Узел, у которого нет родителя, является корнем. –

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