Рекурсивная ф-ция: подсчет общего кол-ва numrows

dadesign

Guest
Рекурсивная ф-ция: подсчет общего кол-ва numrows

Нашел тут FAQ по рекурсивным построителям каталогов (деревьям).

Немного изменил, написал это:


PHP:
function recc2($id,$level=0){ 
connect();

   $q = "select * from category where parent_id=$id order by sort,id,name";
   $res = mysql_query($q) or die("query failed: ".mysql_error());
   $nrows = mysql_num_rows($res);

	if($nrows > 0){
	echo $nrows;
       while($row = mysql_fetch_array($res)){
	   
        recc2($row['id'],$level + 1);
       } 
   }
  
}
recc2($id);

моя таблица mysql имеет поля id,name, parent_id


скажем такого вида

2 Продукты питания 0
. 4 Колбасы 2
. . 6 Москва 4
. . 5 Микоян 4
11 Книги 0
. 12 Фантастика 11
. . 16 Лукьяненко 12
. 13 Фентези 11
. 14 Детективы 11
1 Электроника 0
. 7 Видаки 1
. . 9 VHS 7
. . 10 VHS-C 7
. . . 15 Акксесуары 10
. 8 ДВД 1


Как подсчитать общее количество поддиректорий в директории $id я так и понял... скажем что в продуктах питания - ВСЕГО 3 поддиректории, а в электронике - 5 ???
 

vladax

Новичок
dadesign
чего тут сложного? переделай немного свою рекурсивную функцию с count в запросе и инкременируй переменную количества директорий.

зы ох не люблю я эти рекурсии!
если каталог большой, иди по ссылке, которую дал SIMM
 

dadesign

Guest
Автор оригинала: vladax
dadesign
чего тут сложного? переделай немного свою рекурсивную функцию с count в запросе и инкременируй переменную количества директорий.
Я пробовал, но он как то странно складывает :(
 

sakon

П..и.н..ок
Re: Рекурсивная ф-ция: подсчет общего кол-ва numrows

Автор оригинала: dadesign
PHP:
function recc2($id,$level=0){
.
.
. 
        recc2($row['id'],$level + 1);
       }
Мне непонятна твоя конструкция вызова функции. У тя при каждом вызове $level=0. В результате этот вызов,
PHP:
recc2($row['id'],$level + 1);
бессмыслинен.
 

SiMM

Новичок
Может ты просто как-то странно делал? ;) Покажи, как складывал - может кто подскажет, в чём ты ошибался.
 

jonjonson

Guest
sakon, не каждом, а только если не передан параметр $level.
 

jonjonson

Guest
sakon, ну и что. Эта запись обозначает, что у функции есть один обязательный параметр $id и один не обязательный $level (не обязательный параметр если не определен, то определяется автоматически со значением ноль).

PHP:
function foo ($b=0)
{
    echo $b;
}

foo();
foo(5);
 

dadesign

Guest
sakon

это я тут туториал откопал на форуме.... так советовали :)




SiMM
я просто добавлял переменную $numrows в фунцкцию, по аналогии с $level только:

PHP:
recc2($row['id'],$level + 1,$numrows+=$numrows);
 

dadesign

Guest
sakon

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

if($nrows > 0)
 

sakon

П..и.н..ок
dadesign
Повторяю.
У тебя бесконечный цикл. id у тебя не меняется.
Смотри приват.
 

SiMM

Новичок
sakon, уймись уже.
dadesign, покажи нормально код полностью - $numrows у тебя вообще неопределён, а приведённый код похож на то, что ты просто удваиваешь numrows на каждом вложении.
 

dadesign

Guest
Автор оригинала: SiMM
sakon, уймись уже.
dadesign, покажи нормально код полностью - $numrows у тебя вообще неопределён, а приведённый код похож на то, что ты просто удваиваешь numrows на каждом вложении.
код на этой странице полный...


вызываю я страницу - типа index.php?id=1

дапм MYsql таблицы пришлю позже, потому что все это дома...


$nrows = определен, это количество ...

$nrows = mysql_num_rows($res);

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

мне бы немного теории.. как это В ПРИНЦИПЕ делается...

как я понимаю... идешь сверху вниз - спускаешься по level + 1 по id через parent_id

выбираешь parent_id где id = $id

потом спускаешься ниже и суммируешь... и так пока не кончатся записи...

или как??
 

SiMM

Новичок
Автор оригинала: dadesign
код на этой странице полный...
dadesign, какой же ты сложный. В посте от 10.01.05 23:58 я невижу никаких намёков на попытку посчитать число поддиректорий нижнего уровня - так понятнее?
дапм MYsql таблицы пришлю позже, потому что все это дома...
Можешь оставить его себе.
$nrows = определен, это количество ...
Разницу между numrows и nrows видишь?
только тут он нигде не складввается, потому что я не смог это правильно написать...
А ты попробуй.
как я понимаю... идешь сверху вниз - спускаешься по level + 1 по id через parent_id
Типа того. Возможно, тебе будет проще, если функция будет возвращать количество поддиректорий уровнем ниже.
 

dadesign

Guest
PHP:
function recc2($id,$level=0,$nrows=0){ 
connect(); 

   $q = "select * from category where parent_id=$id order by sort,id,name"; 
   $res = mysql_query($q) or die("query failed: ".mysql_error()); 
   $nrows = mysql_num_rows($res); 

    if($nrows > 0){ 
    echo $nrows; 
       while($row = mysql_fetch_array($res)){ 
        
        recc2($row['id'],$level + 1,$nrows+=$nrows); 
       } 
   } 
   
} 
recc2($id);
я вот так делал... считает вообще какой то бред... :(
 

SiMM

Новичок
Во-первых, не бред, а то, что ты попросил, а во-вторых, используй следующие соображения - функция recc2 должна возвращать (просто так удобнее) количество категорий в заданной. Поэтому работать она должна примерно так - если по запрошенному id больше нет parent_id, возвращаем 1 (у нас спросили число каталогов у заданного id, а у него нет потомков - сумма каталогов равна 1). Если есть - возвращаем сумму каталогов в найденных каталогах-потомках (сумму значений, полученных по recc2 от каждого найденного каталога-потомка). Этого должно быть достаточно, чтобы в итоге написать echo recc2($id) и получить требуемое.
PS: к вопросу рациональности подхода вернёмся позже, когда ты напишешь функцию по этому описанию и опишешь задачу подробнее (одно дело, если тебя это интересует для отдельновзятого каталога, другое - если ты хочешь вывести всю структуру с указанием количества подкаталогов).
 

dadesign

Guest
(одно дело, если тебя это интересует для отдельновзятого каталога, другое - если ты хочешь вывести всю структуру с указанием количества подкаталогов).


мне как раз так и нужно....



Поэтому работать она должна примерно так - если по запрошенному id больше нет parent_id, возвращаем 1 (у нас спросили число каталогов у заданного id, а у него нет потомков - сумма каталогов равна 1). Если есть - возвращаем сумму каталогов в найденных каталогах-потомках (сумму значений, полученных по recc2 от каждого найденного каталога-потомка).


а с этим еще разобраться надо.... непонятно.. почему 1 надо возвращать а не 0.... еще неясно про сумму значений, полученных по recc2 от каждого найденного каталога-потомка


как эту сумму написать... это как раз и что чего я не смог придумать... :))
 
Сверху