Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дерево из Мускула в массив, PHP+MySQL 
V
    Опции темы
wsr
  Дата 15.10.2006, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Fuzzy Logic
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 3.7.2005

Репутация: 1
Всего: 2



Привет всем. Хоть и создавая тему в данном разделе я не являюсь начинающим в 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 

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

Может кто уже делал подобное? Голова просто уже пухнет от рекурсии.
--------------------
 ICQ : 918-318Сайт : Lock-Team 
PM MAIL WWW ICQ   Вверх
skifoz
Дата 15.10.2006, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 23.1.2006
Где: Россия

Репутация: нет
Всего: 1



Можно организовать деревья в SQL и без рекурсии, так я думаю будет проще работать с деревьями.
Посмотри тут http://phpclub.ru/detail/article/2002-06-03
PM MAIL WWW   Вверх
Piphon
Дата 15.10.2006, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 30.3.2004
Где: Екатеринбург

Репутация: 2
Всего: 2



Код

$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'];  // это и есть дерево


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

Это сообщение отредактировал(а) Piphon - 8.11.2006, 19:09
--------------------
Non Progredi Est Regredi...
PM MAIL ICQ   Вверх
wsr
Дата 15.10.2006, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Fuzzy Logic
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 3.7.2005

Репутация: 1
Всего: 2



Большое СПС Piphon. Это именно то, что мне было нужно.

Репа +1
--------------------
 ICQ : 918-318Сайт : Lock-Team 
PM MAIL WWW ICQ   Вверх
sani79
Дата 8.11.2006, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 14.12.2005

Репутация: нет
Всего: нет



wsr,  А как ты вывел дерево? Можно код?
PM MAIL   Вверх
sani79
Дата 8.11.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 14.12.2005

Репутация: нет
Всего: нет



Вопрос не праздный, просто у меня сейчас такая же задачка стоит (вывести дерево). Структура таблицы такая же. Никак не соображу как мне это сделать.
PM MAIL   Вверх
Piphon
Дата 8.11.2006, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 30.3.2004
Где: Екатеринбург

Репутация: 2
Всего: 2



Код

  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' были написанны с маленькой буквы.
--------------------
Non Progredi Est Regredi...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1024 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.