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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> рекурсия с определёной веткой? 
:(
    Опции темы
WebUser
Дата 4.5.2010, 02:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



имеется рекурсивная функция getListing(), которой передаётся массив разделов из БД в таком формате

Код

$arr[$row['parent']][] = array('id'=>$row['id'], 'parent' => $row['parent'], 'name' => $row['name']); 



Код

<?php
public function getListing($data, $parent, $lvl) 
    {           
         static $out = '';
         if (!isset($data[$parent])) return;
            $indent =  str_repeat('  ', $lvl); 
            $out .= $indent."<ul>\n";
            
            foreach($data[$parent] as $v) 
            {  
               $out .= $indent.'  <li><a href="'.$v['id'].'">'.$v['name']."</a></li>\n";

               $this->getListing($model, $v['id'], $lvl+1);
            }
            
       $out .= $indent."</ul>\n";
       return $out;
    }    
?> 


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

getListing($arr, 0, 0) 

Код

Cars
-- chevy
-- ford
---- mustang
---- ranger
-- toyota
Food
-- fruit
---- apples
---- oranges
------- sunny
------- green
-- pasta
-- veges
Acura
BMW


вопрос, как сделать если нужно вывести не всё карту а только одну ветку, в примеру если укажем

getListing($arr, 8, 0) 
где 8 это ID раздела mustang

нужно чтобы получилась такая ветка

Код

Cars
-- chevy
-- ford
---- mustang
---- ranger
-- toyota
Food
Acura
BMW


как такое сделать?

переискал во всём инете, везде примеры генерировании всей ветки.

надо получить только одну ветку, остальные не трогать, вот как тут на примере, при выборе раздела "Компас"
http://www.satsite.ru/category/cat-43/


PM MAIL   Вверх
ksnk
Дата 4.5.2010, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



WebUser, наверное стоило parent'ов назвать childs' ами  smile 
А так - все просто - сначала пробегаем по всем элементам $data и приписываем во все веточки адрес настоящего парента. Потом, начиная с текущего элемента приписываем всем "непосредственным" родителям какой-нибудь флажек - "selected", к примеру. Можно совместить эту пару проходов в одну рекурсивную акцию, но объяснять будет сложнее ;)
А вот потом уже выводим это дерево этой самой функцией getListing. Вот только идем "вниз" только для веток, отмесенных флагом "selected".
Как-то так...


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


Новичок



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

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



было бы не плохо посмотреть пример, если это возможно;)

то как я понимаю, можно как то сделать так

Код

    public function getParentPath($arr,$id)
    {   
          
      if($id <= 1 || $id >= sizeof($arr) ) return;

          $parent = $arr[$id]['parent'];
          $path = $arr[$id]['id'];

          while($parent)
          {     
              if($arr[$parent]['parent'] == $arr[$parent]['id']) break;  
              $path = $arr[$parent]['id'].','.$path;
              $parent = $arr[$parent]['parent'];
               
          }
          
      return $path;
    } 


тоесть если мы знаем ID раздела, то данной функцией мы определяем ID родителей, снизу Вверх до самого корня.  Затем строим массив всей ветки относящимся родителям, и отдельный массив только разделов первого уровня, и затем всё это совмещаем, но вот как это сделать я пока не силён, может кто поможет?



Это сообщение отредактировал(а) WebUser - 4.5.2010, 17:15
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.0652 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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