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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нумерация дерева, дерево построил а пронумеровать не могу 
V
    Опции темы
Vardoulacha
Дата 9.3.2012, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Итак деревья, вот такой исходный массив получается из базы, с сортировкой по полю position

Код

    $category[0][] = array('id' => 1, 'position' => 1, 'title' => 'первая');
    $category[1][] = array('id' => 3, 'position' => 1, 'title' => 'первая - первая');
    $category[3][] = array('id' => 6, 'position' => 1, 'title' => 'первая - первая - первая');
    $category[9][] = array('id' => 7, 'position' => 1, 'title' => 'первая - первая - вторая - первая');
    $category[0][] = array('id' => 2, 'position' => 2, 'title' => 'вторая');
    $category[1][] = array('id' => 4, 'position' => 2, 'title' => 'первая - вторая');
    $category[9][] = array('id' => 8, 'position' => 2, 'title' => 'первая - первая - вторая - вторая');
    $category[3][] = array('id' => 9, 'position' => 2, 'title' => 'первая - первая - вторая');
    $category[1][] = array('id' => 5, 'position' => 3, 'title' => 'первая - третья');


это поле parent
Код

$category[0][]


остальные понятны по названию

вот код который за раз строит упорядоченное дерево и выводит его

Код

    function build_tree($category, $parent = 0, $level = 0)
    {
        if(is_array($category) AND count($category[$parent]) > 0)
        {
            foreach($category[$parent] as $categ)
            {
                $padd = $level * 20;
                echo '<div style="padding-left:'.$padd.'px;">'.$categ['position'].'. '.$categ['title'].'</div>';
                build_tree($category, $categ['id'], $level + 1);
            }
        }
    }

    build_tree($category);


и вот результат работы
Код

1. первая
     1. первая - первая
          1. первая - первая - первая
          2. первая - первая - вторая
               1. первая - первая - вторая - первая
               2. первая - первая - вторая - вторая
     2. первая - вторая
     3. первая - третья
2. вторая


и собственно никак не могу придумать каким макаром сделать вот такую красивую нумерацию

Код

1. первая
     1.1. первая - первая
          1.1.1. первая - первая - первая
          1.1.2. первая - первая - вторая
               1.1.2.1. первая - первая - вторая - первая
               1.1.2.2. первая - первая - вторая - вторая
     1.2. первая - вторая
     1.3. первая - третья
2. вторая


понимаю что нужно вроде как-то в функцию сделать сбор всех родителей в переменную path но вот как это собрать не понимаю, помогите плиз
PM MAIL   Вверх
ksnk
Дата 9.3.2012, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Цитата(Vardoulacha @  9.3.2012,  07:32 Найти цитируемый пост)
каким макаром сделать вот такую красивую нумерацию

Четвертым параметром в build_tree передавай текущий номер -префикс, который будет добавляться всем чилдам.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
MoLeX
Дата 9.3.2012, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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





--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Vardoulacha
Дата 9.3.2012, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



MoLeX, да я в первую очередь прочитал эту тему, но там такой кавардак, и в основном сводится к постройке массива дерева в переменной

Цитата(ksnk @  9.3.2012,  08:44 Найти цитируемый пост)
Четвертым параметром в build_tree передавай текущий номер -префикс, который будет добавляться всем чилдам. 

ну это да, тоже думал про префиксы и передавать их параметром, сейчас ухожу не будет компа под рукой, завтра буду пробовать аттачить префикс

мдааа ))) на запрос в гугле "php красивая нумерация дерева" вылазит эта моя тема ))

вот родил вот такой код

Код

    function build_tree($category, $parent = 0, $level = 1, $path = '')
    {
        if(is_array($category) AND count($category[$parent]) > 0)
        {
            foreach($category[$parent] as $categ)
            {
                $padd = ($level - 1) * 20;
                echo '<div style="padding-left:'.$padd.'px;">'.$path.$categ['position'].'. '.$categ['title'].'</div>';
                build_tree($category, $categ['id'], $level + 1, $path .= $level.'.');
            }
        }
    }


теперь результат выглядит так

Код

1. первая
   1.1. первая - первая
      1.2.1. первая - первая - первая
      1.2.3.2. первая - первая - вторая
         1.2.3.3.1. первая - первая - вторая - первая
         1.2.3.3.4.2. первая - первая - вторая - вторая
   1.2.2. первая - вторая
   1.2.2.3. первая - третья
1.2. вторая


теперь осталось вывернуть мозг наизнанку и родить откат пути

Это сообщение отредактировал(а) Vardoulacha - 9.3.2012, 14:43
PM MAIL   Вверх
ksnk
Дата 9.3.2012, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Код

...
build_tree($category, $categ['id'], $level + 1, $path .$level.'.');// БЕЗ ПРИСВАИВАНИЯ!
...



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
MoLeX
Дата 9.3.2012, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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



эх. раньше голову тоже ломал с этими деревьями, сейчас уже нет 



--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Vardoulacha
Дата 9.3.2012, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



ksnk, блииин, не может быть что всё так просто )) но радость была короткой

вот при таком коде, результат правильный, но как только добавляю ещё один уровень вложенности, всё ломается
Код

    function build_tree($category, $parent = 0, $level = 0, $path = '')
    {
        if(is_array($category) AND count($category[$parent]) > 0)
        {
            foreach($category[$parent] as $categ)
            {
                $padd = $level * 20;
                echo '<div style="padding-left:'.$padd.'px;">'.$path.$categ['position'].'. '.$categ['title'].'</div>';
                ($level == 0 ? $path_level = 1 : $path_level = $level);
                build_tree($category, $categ['id'], $level + 1, $path.$path_level.'.');
            }
        }
    }


если к начальному массиву добавить это
Код

    $category[7][] = array('id' => 10, 'position' => 1, 'title' => 'первая - первая - вторая - первая - первая');
    $category[7][] = array('id' => 11, 'position' => 2, 'title' => 'первая - первая - вторая - первая - вторая');


результат будет такой
Код

1. первая
   1.1. первая - первая
      1.1.1. первая - первая - первая
      1.1.2. первая - первая - вторая
         1.1.2.1. первая - первая - вторая - первая
            1.1.2.3.1. первая - первая - вторая - первая - первая
            1.1.2.3.2. первая - первая - вторая - первая - вторая
         1.1.2.2. первая - первая - вторая - вторая
   1.2. первая - вторая
   1.3. первая - третья
2. вторая


нутром понимаю что дело тут в параметре position который отдельно вставляется, а должен тоже идти с путем как-то, вот сижу смотрю на код и вижу фигу ((

а и ещё вот вижу что проблема немного глубже, сейчас структура легкая, а если дерево усложнить и добавить веток то проблема нумерации встанет более явно, сейчас она по порядку идет ветвление и поэтому примерно даже работает, на более низких только заметно, а если взять массив такой

Код

    $category[0][] = array('id' => 1, 'position' => 1, 'title' => 'первая');
    $category[1][] = array('id' => 3, 'position' => 1, 'title' => 'первая - первая');
    $category[3][] = array('id' => 6, 'position' => 1, 'title' => 'первая - первая - первая');
    $category[9][] = array('id' => 7, 'position' => 1, 'title' => 'первая - первая - вторая - первая');
    $category[0][] = array('id' => 2, 'position' => 2, 'title' => 'вторая');
    $category[1][] = array('id' => 4, 'position' => 2, 'title' => 'первая - вторая');
    $category[9][] = array('id' => 8, 'position' => 2, 'title' => 'первая - первая - вторая - вторая');
    $category[3][] = array('id' => 9, 'position' => 2, 'title' => 'первая - первая - вторая');
    $category[1][] = array('id' => 5, 'position' => 3, 'title' => 'первая - третья');
    $category[7][] = array('id' => 10, 'position' => 1, 'title' => 'первая - первая - вторая - первая - первая');
    $category[7][] = array('id' => 11, 'position' => 2, 'title' => 'первая - первая - вторая - первая - вторая');
    $category[6][] = array('id' => 12, 'position' => 1, 'title' => 'первая - первая - первая - первая');
    $category[6][] = array('id' => 13, 'position' => 2, 'title' => 'первая - первая - первая - вторая');
    $category[6][] = array('id' => 14, 'position' => 3, 'title' => 'первая - первая - первая - третья');
    $category[10][] = array('id' => 15, 'position' => 1, 'title' => 'первая - первая - вторая - первая - первая - первая');


то результат будет уже вот такой
Код

1. первая
   1.1. первая - первая
      1.1.1. первая - первая - первая
         1.1.2.1. первая - первая - первая - первая
         1.1.2.2. первая - первая - первая - вторая
         1.1.2.3. первая - первая - первая - третья
      1.1.2. первая - первая - вторая
         1.1.2.1. первая - первая - вторая - первая
            1.1.2.3.1. первая - первая - вторая - первая - первая
               1.1.2.3.4.1. первая - первая - вторая - первая - первая - первая
            1.1.2.3.2. первая - первая - вторая - первая - вторая
         1.1.2.2. первая - первая - вторая - вторая
   1.2. первая - вторая
   1.3. первая - третья
2. вторая


Добавлено через 7 минут и 5 секунд
MoLeX, что-то мне не нравится nested sets из-за лишних данных в базе, в данном коде только id да parent_id

единственная проблема с красивую нумерацию построить

Это сообщение отредактировал(а) Vardoulacha - 9.3.2012, 17:28
PM MAIL   Вверх
ksnk
Дата 9.3.2012, 17:52 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Код

function build_tree($category, $parent = 0, $level = 0, $path = '')
    {
        if(is_array($category) AND count($category[$parent]) > 0)
        {
            $number=1;
            foreach($category[$parent] as $categ)
            {
                $padd = $level * 20;
                echo '<div style="padding-left:'.$padd.'px;">'.$path.$categ['position'].'. '.$categ['title'].'</div>';
                build_tree($category, $categ['id'], $level + 1, $path.($number++).'.');
            }
        }
    }



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
MoLeX
Дата 9.3.2012, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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



Цитата(Vardoulacha @  9.3.2012,  17:23 Найти цитируемый пост)
MoLeX, что-то мне не нравится nested sets из-за лишних данных в базе, в данном коде только id да parent_id

единственная проблема с красивую нумерацию построить


левый и правый ключ еще добавляется. зато очень удобно выводить и все просто. надо только разобраться


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Vardoulacha
Дата 10.3.2012, 04:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



ksnk, неужели всё так просто, хотя я бы никогда не догадался, спасибо огромное, вот и появился в интернете полный пример по сбору дерева из базы и по его красивому выводу

MoLeX, ну вот из-за левого и правого ключа как и лишние данные, объем данных в жертву удобству
PM MAIL   Вверх
gta4kv
Дата 10.3.2012, 08:22 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

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



Объем данных? Вы о двух столбцах с INT'выми значениями? Ну-ну..
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

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

Важно:

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

Внимание:

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

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

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


 




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


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

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