дерево базы данных в многомерный массив - PullRequest
3 голосов
/ 01 февраля 2010

У меня есть простое дерево базы данных с парентидом, и я хочу прочитать БД и получить массив, как указано выше

Array
(
 Title: Category 1
 Children => Array
             (
              => Title: Category 1.1

              => Title: Category 1.2
                     Children =>  Array
                               (
                                => Title: Category 1.2.1

                               )
              ) 

)

Я пытаюсь реализовать с кодом выше

    function getTree($rootid)
    {
       $result = =mysql_query("select * from tree where parentid='$rootid'");
       while ($row = mysql_fetch_array($result)) { 

        $arr[]=$row["Title"];
        getChilds($row["id"]);

      }

    }


   function getChilds($id)
    {
       $result = =mysql_query("select * from tree where parentid='$id'");
       while ($row = mysql_fetch_array($result)) { 

        //childers nodes here
        $arr[]=$row["Title"];

        getChilds($row["id"]);

      }

    }

}

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

Его реализация внутри класса, и я знаю, что должен передать как & $ arr, но я не уверен, как

Любая помощь приветствуется

Спасибо

Ответы [ 2 ]

4 голосов
/ 01 февраля 2010

Попробуйте что-то вроде этого:

<?php
function getTree($rootid)
{
   $arr = array();

   $result = mysql_query("select * from tree where parentid='$rootid'");
   while ($row = mysql_fetch_array($result)) { 
     $arr[] = array(
       "Title" => $row["Title"],
       "Children" => getTree($row["id"])
     );
   }
   return $arr;
}
?>
3 голосов
/ 01 февраля 2010

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

Почему? Посмотрите, в большинстве случаев (читай: в 99,99% случаев) узким местом вашего приложения будет БД. Обход дерева предзаказа действительно выглядит более сложным (в основном потому, что он не моделируется после того, как ваши данные находятся в «естественном» состоянии, рекурсивно), но вам нужно отправить запрос только один раз, и все готово. Кроме того, в 99% случаев ваше приложение будет отображать только дерево, а не изменять или переупорядочивать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...