Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Рекурсия и option
 
 автор: rised   (26.09.2006 в 18:00)   письмо автору
 
 

Здравствуйте, знатоки Php!

У меня возник вопрос, над которым я ломаю голову второй день.

Есть список категорий, который выводится из базы MySQL с помощью рекурсивной функции, указанной здесь же на форуме. Для построения меню я использую
<ul>
.

Но возникает вопрос, как сделать, чтобы был отступ в виде указанного знака, если выводить всю структуру в выпадающем списке?

Я написал следующее:

function treeSelect($ids) 
    { 
    $query = "SELECT * FROM bbs_categories WHERE parentCatId = " . $ids . " ORDER BY prior"; 
    $result = mysql_query($query); 

    while ( $print = mysql_fetch_array($result)) 
        { 
        $ide = $print['catId']; 
        global $i;
        if ($ids == 0)
        {$i = 0;}
        $i = $i + 1;
        $nbsp = "&bull;";
        $otstup = str_repeat($nbsp, $i);
        echo "<option value='{$print['catId']}'>{$otstup}".$print['catName']."</option>"; 
        treeSelect($ide); 
        } 

    } 


Но если для категории (самого высшего уровня) это работает, то в подкатегориях творится ужас. Рекурсия идет по порядку и все время добавляет 1 к $i, а мне нужно, чтобы она сообразила, что переходит от Покатегории1 ($i = 1) к ПодПодкатегории1 ($i =2), а потом к Подкатегории2 ($i =1) и т.д.

Как поймать закономерность за хвост? ;)

Спасибо всем откликнувшимся, я уже веревку мылю...

   
 
 автор: Trianon   (26.09.2006 в 18:06)   письмо автору
 
   для: rised   (26.09.2006 в 18:00)
 

Веревку - для откликнувшихся?

function treeSelect($ids, $lev)  
    {  
    $query = "SELECT * FROM bbs_categories WHERE parentCatId = " . $ids . " ORDER BY prior";  
    $result = mysql_query($query);  

    while ( $print = mysql_fetch_array($result))  
        {  
        $ide = $print['catId'];  
        $nbsp = "&bull;"; 
        $otstup = str_repeat($nbsp, $lev); 
        echo "<option value='{$print['catId']}'>{$otstup}".$print['catName']."</option>";  
        treeSelect($ide, $lev+1);  
        }  

    } 



treeSelect(0,0) ;

   
 
 автор: rised   (26.09.2006 в 18:31)   письмо автору
 
   для: Trianon   (26.09.2006 в 18:06)
 

Trianon!

Веревку мылил для себя, но Вы меня вытащили из петли! ;)

Искренне благодарю Вас! С чувством переполняющей радости, которая связана с освобождением от мук и страданий.

Это невероятно! Вы даже написали так, что вставил код - и все заработало, моей благодарности нет предела!

P.S. Вы не могли бы дать мне ссылку на подробное описание рекурсии, потому что в книге PHP 5 (первая часть) написано достаточно схематически. (или я просто не в состоянии понять)

Еще раз спасибо, Вы меня выручили!

   
 
 автор: Trianon   (26.09.2006 в 21:01)   письмо автору
 
   для: rised   (26.09.2006 в 18:31)
 

При каждом вызове функции создается новый комплект переменных входных параметров (в Вашем случае это $ids и $lev) и всех переменных, которым присвиваются значения (в Вашем случае это $query, $result, $ide, $nbsp, $otstup). Этот комплект существует все время, пока выполняется код функции. При возврате из функции комплект уничтожается.
Так происходит и тогда, когда функция вызывает сама себя. В этом случае также создается новый комплект. Поэтому переменная $lev категории и переменная $lev подкатегории - это разные переменные.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования