[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Хитрая задачка с циклом
lans8097
В общем ни как не магу построить цикл для много уровневых категорий
К примеру есть база с таблицей
category
в таблице вот такие ичейки
id(auto_includ),name(text),category(Тут ид категории которой эта категория принадлежит)

Ограничений в уровнях нет тобиш может быть хоть по 100 пот категорий в пот категориях поткатегорий итд
Вопрос как вывести древо категорий ? ))
Бо не знаю как по хитрому сделать цикл чтобы выполнялся до последней категории и собирал как надо _)



Спустя 2 минуты, 51 секунда (14.12.2011 - 18:48) Игорь_Vasinsky написал(а):
а где наработка???

с помощью рекурсивной функции.

Спустя 4 минуты, 51 секунда (14.12.2011 - 18:53) lans8097 написал(а):
Цитата (Игорь_Vasinsky @ 14.12.2011 - 15:48)
а где наработка???

с помощью рекурсивной функции.

так то даж нароботкой незя назвать
Написал пару уровней но понял что так оно будит работать толклько прописаное количество раз
Что здесь не подходит так как в одной категории может быть 20 категорий а в другой 1

Уже читаю про то что ты мне дал

Спустя 30 минут, 31 секунда (14.12.2011 - 19:23) Invis1ble написал(а):

Спустя 48 минут, 37 секунд (14.12.2011 - 20:12) Эдик написал(а):

// Выбор из таблицы всего дерева
$sql="SELECT * FROM category;";
$result=mysql_query($sql,$connect);

// формируем массив результатов
$res=array();
while($row=mysql_fetch_assoc($result)){
$res[]=$row;
}

// собственно сама функция
function get_tree($res,$root,$connect){
$out="";
foreach($res as $row){
if($res['category']==$root && isset_child($res['id'],$connect)==TRUE){
$out.="<li>".$row['name']."<ul>";
$out.=get_tree($res['id']);
}
else
$out="<li>".$row['name']."</li>";
}
$out.="</ul></li>";
return $out;

}
// функция проверки есть ли у данного id потомки
function isset_child($id,$connect){
$out=FALSE;
$isset='no';
$sql="SELECT id from category WHERE id=".$id.";";
$result=mysql_query($sql,$connect);
while($row=mysql_fetch_assoc($result)){
$isset=$row['id'];
}
if($isset!='no')
$out=TRUE;
return $out;
}

// Вызов функции

echo "<ul>";
echo get_tree($res,"",$connect);
echo "</ul>";

Вроде так

Спустя 9 минут, 14 секунд (14.12.2011 - 20:21) Эдик написал(а):
Я так понимаю, если у id нету родителя, то после с category пустое?

Спустя 1 час, 42 минуты, 27 секунд (14.12.2011 - 22:03) lans8097 написал(а):
Цитата (Эдик @ 14.12.2011 - 17:21)
Я так понимаю, если у id нету родителя, то после с category пустое?

Спс за вариант но я уже разобрался ))
Нет. Если пот категории нет то просто 0 тобиш самая главная родительская категория

function ShowTree($ParentID, $lvl) {
global $lvl;
static $menu;
$myrow = mysql_query("SELECT id,name,pot_category FROM category WHERE pot_category='".$ParentID."'");
if(mysql_num_rows($myrow)){

while($result = mysql_fetch_assoc($myrow)){
for($i=1;$i<=$lvl;$i++){$strelka .='--';}
$lvl++;
$menu .=('<option value="'.$result['id'].'">'.$strelka.'> '.$result['name'].'</option>');
ShowTree($result['id'], $lvl);
$lvl--;
}
}


Спустя 1 день, 11 часов, 26 минут, 6 секунд (16.12.2011 - 09:30) lans8097 написал(а):
Немного подправил код

<?php
class
menuInc{
private $root;//Дериктория каторую нужно выбрать автоматом
function __construct($root=NULL){
$this->root=$root;
}
function Menu($id,$lvl) {
static $lvl;
static $menu;
$myrow = mysql_query("SELECT id,name FROM category WHERE pot_category='".$id."'");
if(mysql_num_rows($myrow)){
while($result = mysql_fetch_assoc($myrow)){
if($this->root){if($result['id']==$this->root){$checked='selected="selected"';}}
for($i=1;$i<=$lvl;$i++){$strelka .='  ';}
if(!empty($strelka)){$strelka .='-';}
$lvl++;
$menu .=('<option value="'.$result['id'].'" '.$checked.'>'.$strelka.' '.$result['name'].'</option>');
if(!empty($strelka)){unset($strelka);}
if(!empty($checked)){unset($checked);}
$this->Menu($result['id'], $lvl);
$lvl--;
}
}

return $menu;
}
}

?>
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.