2015-08-11 1 views
0

Я пытаюсь работать с базой данных, содержащей информацию о категории. Связь между элементами присутствует только в виде parent_id. Я знаю, что могу сделать некоторые «обходные пути», чтобы достичь цели, но должно быть лучшее решение. Я мог бы написать дополнительную информацию в базу данных, такую ​​как глубокость, но я уверен, что есть комбинация loop/array_filter, о которой я не знаю.Цитирование по категориям и построение дерева категорий с использованием родительского идентификатора

Это то, что у меня есть:

Array 
(
[0] => Array 
    (
     [id] => 0 
     [parent_id] => 0 
     [title] => All 
    ) 

[1] => Array 
    (
     [id] => 23 
     [parent_id] => 0 
     [title] => Nature 
    ) 

[2] => Array 
    (
     [id] => 3 
     [parent_id] => 4 
     [title] => Thriller 
    ) 

[3] => Array 
    (
     [id] => 4 
     [parent_id] => 0 
     [title] => Drama 
    ) 

[4] => Array 
    (
     [id] => 1 
     [parent_id] => 0 
     [title] => Crime 
    ) 

[5] => Array 
    (
     [id] => 19 
     [parent_id] => 23 
     [title] => Documentation 
    ) 

[6] => Array 
    (
     [id] => 20 
     [parent_id] => 23 
     [title] => Coverage 
    ) 

[7] => Array 
    (
     [id] => 21 
     [parent_id] => 19 
     [title] => Isles 
    ) 

Это то, что я хочу:

Array 
(
[0] => Array 
    (
     [id] => 0 
     [parent_id] => 0 
     [title] => All 
     [0] => Array 
      (
       [id] => 23 
       [parent_id] => 0 
       [title] => Nature 
       [0] => Array 
         (
          [id] => 19 
          [parent_id] => 23 
          [title] => Documentation 
          [0] => Array 
            (
             [id] => 21 
             [parent_id] => 19 
             [title] => Isles 
            ) 
         ) 
       [1] => Array 
         (
          [id] => 20 
          [parent_id] => 23 
          [title] => Coverages 
         ) 
       ) 

     [1] => Array 
      (
       [id] => 4 
       [parent_id] => 0 
       [title] => Drama 
       [0] => Array 
         (
          [id] => 3 
          [parent_id] => 4 
          [title] => Thriller 
         ) 
      ) 

     [2] => Array 
      (
       [id] => 1 
       [parent_id] => 0 
       [title] => Crime 
      ) 
    ) 

Я попробовал его с петлями и array_filter(), но она не работает. Я пробовал его с помощью цикла внутри функции и вызывал функцию в одном цикле, но он не работал. Затем я начал пробовать его только с 1 подкатегорией, но это не может быть решением или обходным путем.

$categories = [see first code block] 
$i = -1; 
$j = -1; 

foreach ($categories as $cat) { 
    $i++; 
    if ($cat['parent_id'] > 0) { 
     $j = -1; 
     foreach ($categories as $cat2) { 
      $j++; 
      if ($cat2['id'] == $cat['parent_id']) { 
       $categories[$j][] = array("id" => $cat['id'], "parent_id" => $cat['parent_id'], "title" => $cat['title']); 
       unset($categories[$i]); 
       continue 2; 
      } 
     } 
    } 
} 

Я был бы рад за каждый толчок в правильном направлении. Благодаря!

+0

Кажется, дубликат [этого вопроса] (http://stackoverflow.com/questions/10646833/using-mysql-query-to-traverse-rows-to-make-a-recursive-tree). –

+0

thx! Это перенаправляет на это: http://dba.stackexchange.com/questions/7147/find-highest-level-of-a-chitectical-field-with-vs-without-ctes/7161#7161 , что очень интересно. Когда у меня есть решение и рабочий код, я отправлю его здесь. – Seba

ответ

0

я нашел рабочий soltuion в этом ответе: https://stackoverflow.com/a/20286566/5215634

Положительно отметить, что только один запрос к базе данных выполняется, и результирующий набор обрабатывается в дереве(). Если мой код готов, я отправлю его здесь.