Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Дерево из Мускула в массив


Автор: wsr 15.10.2006, 18:03
Привет всем. Хоть и создавая тему в данном разделе я не являюсь начинающим в PHP, но сегодня просто видимо не мой день и у меня совсем не работает голова.

Есть дерево, хранящееся в MySQL таблице
Код

CREATE TABLE `tree` (
    `ID` SMALLINT( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `ParentID` SMALLINT( 5 ) UNSIGNED NOT NULL DEFAULT '0',
    `Title` TINYTEXT NOT NULL 
)


Собственно, в данной таблице есть данные касательно родителей и потомков в дереве.

Вывести дерево у меня нет проблем :
Код

 1 - First Section
 2 - Second Section
     4 - First Sub-Section
     5 - Second Sub-Section
         7 - first_sub_section 
 3 - Third Section
     6 - First Sub-Section 

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

Может кто уже делал подобное? Голова просто уже пухнет от рекурсии.

Автор: skifoz 15.10.2006, 20:33
Можно организовать деревья в SQL и без рекурсии, так я думаю будет проще работать с деревьями.
Посмотри тут http://phpclub.ru/detail/article/2002-06-03

Автор: Piphon 15.10.2006, 20:36
Код

$array_items[0]['items'] = array();  //  корень дерева
foreach ($row = mysql_fetchrow($result)) ///* выборка строки из мускула */)
{
  unset ($element);
    
  $id     = $row['ID'];
  $parent_id = $row['ParentID'];

  // сохранение информации
  if (!array_key_exists($id, $array_items))
  {
    $array_items[$id] = array('ID' => $row['ID'], 
                              'ParentID' => $row['ParentID'],
                              'Title' => $row['Title'],
                              'Items' => array());
  }
  else 
  {
    $array_items[$id]['ID']       = $row['ID'];
    $array_items[$id]['ParentID'] = $row['ParentID'];
    $array_items[$id]['Title']    = $row['Title'];
  }

  // проверка существования родителя, иначе создание
  if (!array_key_exists($parent_id, $array_items))
  {
    $array_items[$parent_id] = array('Items' => array());
  }
  
  // 
  $element = &$array_items[$id];
  $parent = &$array_items[$parent_id];
  $parent['items'][] = &$element;
}
$array_tree = $array_items[0]['Items'];  // это и есть дерево


Можно и так... Быстро и сразу же, с одним доп. масивом

Автор: wsr 15.10.2006, 21:18
Большое СПС Piphon. Это именно то, что мне было нужно.

Репа +1

Автор: sani79 8.11.2006, 16:50
wsr,  А как ты вывел дерево? Можно код?

Автор: sani79 8.11.2006, 17:26
Вопрос не праздный, просто у меня сейчас такая же задачка стоит (вывести дерево). Структура таблицы такая же. Никак не соображу как мне это сделать.

Автор: Piphon 8.11.2006, 19:21
Код

  function write_level($item ,$level = 0)
    {
      $title = $item['Title'];
      if ($title)
      {
        $app = 4*$level;
        $app = $app>0 ? $app : 0;
        echo str_repeat(" ", $app) . $title . "\r\n";
      }
        
      foreach($item['Items'] as $child)
      {
        write_level($child, $level + 1);
      }
    }    

  // А вот это пишишь там где тебе нужен выход
  $arr = array('Items' => $array_tree);
  write_level($arr, -1); 


Для моего предыдущего кода подходит. Но в нем была ошибка (возможно отличие PHP5 и PHP4). 'Items' были написанны с маленькой буквы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)