|
|
|
| Имеется таблица разделов стандартного типа
id parent name count
id - айди номер раздела
parent - хранит айди номер родителя
name - название раздела
count - кол-во записей разделе
так вот, нужно какимто образомм для каждого раздела вычислить кол-во записей?
можно конечно пройтись циклом по всем разделам и определить кол-во записей, но это былобы неправельно
т.к нужно чтобы и родитель знал сколько записей имеется в его подразделах
иначе например если я как написал выше пройдясь циклом по всем разделам, определив напимер у подраздела
столько то записей а если у родителя нет записей то получится что родитель не имеет нисколько запией а подраздел
имеет, а надо чтобы родитель занл все записи со всех его подразделов.
Может кто уже сталкивался с этой проблемой, просто пока сам немогу понять алгоритма
Уровень разделов не ограничен. | |
|
|
|
|
|
|
|
для: Terri
(02.11.2006 в 13:54)
| | Если каталоги организованы в виде дерева - нужно рекурсивно спускаться по списку каталогов и подсчитывать количество записей в каждом из подкаталогов. | |
|
|
|
|
|
|
|
для: cheops
(02.11.2006 в 16:22)
| | а нигде случайно нет примера, или может кто-то уже решал даный вопрос, сам я пока могу только пройтись по всем разделам и определить кол-записей, но как чтобы у родителей ещё высчитывались, для меня пока ещё сложно | |
|
|
|
|
|
|
|
для: Terri
(03.11.2006 в 17:16)
| |
<?
$sql = "SELECT id, parent, name FROM tab";
$res = mysql_query($sql) or die("Error in $sql: ".mysql_error());
$tree = array(); $names = array();
while($row = mysql_fetch_row($res))
{
list($id, $parent, $name) = $row;
$tree[$parent][] = $id;
$names[$id] = $name;
}
function recur_count($tree, $p)
{
$cnt =0;
if(isset($tree[$p]))
for($cnt=1, $idx = 0; $idx < count($tree[$p]); $idx++)
$cnt += recur_count($tree, $tree[$p][$idx]);
return $cnt;
}
?>
|
| |
|
|
|
|
|
|
|
для: Trianon
(03.11.2006 в 17:39)
| | Trianon, спасибо, токо как пользоваться несмог понять при запуске показывается ошибка
Parse error: parse error, unexpected T_FOR in c:\server\www\script.php on line 22
кстати, запускал таким образом, просто с низу добавил
echo recur_count($tree, $p);
а вверху поменл на свою таблицу | |
|
|
|
|
|
|
|
для: Terri
(03.11.2006 в 18:35)
| | малость ошибся. Закрывающую скобку забыл в конце
if(isset($tree[$p]))
В вызове нужно в качестве $p указывать id корневого узла. | |
|
|
|
|
|
|
|
для: Trianon
(03.11.2006 в 17:39)
| | насчёт ошибки я разобрался, спасибо
вообщем то вроде разобрался, но я так понял данный код работает только с двух уровневыми разделами, а как если с многоуровневыми? | |
|
|
|
|
|
|
|
для: Terri
(03.11.2006 в 19:08)
| | Число уровней ничем не ограничено.
(В разумных пределах. ) | |
|
|
|
|
|
|
|
для: Trianon
(03.11.2006 в 19:11)
| | понятно
как я понимаю, правельно нужно делать так, сперва пройтись по всем записям для каждого раздела посчитать кол-во записей их можно занести в массив для начала к примеру ид_раздела=кол-во записей а далее уже использовать ваш приведённый код, где потом уже из массива ид_раздела=кол-во высчитывать кол-во записей для родителей.
правдо ещё немогу ваш код переворить, ну вроде что-то уже стал понимать | |
|
|
|