дерево каталога

Aidar

Guest
дерево каталога

Имеется таблица mysql с полями:
1. id - ид записи
2. folder - если 1, значит это каталог, если 0 - файл
3. parent - указывает на id каталога, в котором расположен текущий каталог или файл. если 0, значит текущий каталог (файл) лежит в корне
4. имя каталога или файла

помогите построить дерево каталогов вида:
- Каталог_1
-- Каталог_2
--- Каталог_5
---- файл_7
---- файл_8
-- Каталог_4
-- файл_6

сколько я не бился, у меня не получается =(
 

Aidar

Guest
написал функцию:
PHP:
function tree ($id=0) {
  $str = '';
  $q = db_query("SELECT * FROM `".SQL_PREFIX."catalog` WHERE catalog_parent='".$id."' ORDER BY !catalog_folder,catalog_id,catalog_name");
  for ($i=0; $i<mysql_num_rows($q); $i++) {
    $f = mysql_fetch_assoc($q);
    if($f['catalog_folder'] == 1) {
      $str .= $f['catalog_name']."<br>";
      $str .= tree($f['catalog_id']);
    } else {
      $str .= $f['catalog_name']."<br>";
    }
  }
  return $str;
}
print tree();
которая выводит дерево на экран, но выводит его без отступов =:)

Каталог_1
Каталог_2
Каталог_5
файл_7
файл_8
Каталог_4
файл_6

подскажите, как можно добавить отступы?
 

SiMM

Новичок
> как можно добавить отступы?
Передавать уровень вложенности (число отступов) в функцию tree (либо, как вариант, завести там static-значение, которое будет инкрементироваться перед вызовом tree и декрементироваться после него). Соответсвенно с уровнем делать и отступы.
 

Aidar

Guest
сделал так:
PHP:
function tree ($id=0, $current=1) {
	$str = '';
	$nbsp = '';
	for ($i=1; $i<$current; $i++) {$nbsp .= '&nbsp;&nbsp;&nbsp;';}
	$q = db_query("SELECT * FROM `".SQL_PREFIX."catalog` WHERE catalog_parent='".$id."' ORDER BY !catalog_folder,catalog_name");
	for ($i=0; $i<mysql_num_rows($q); $i++) {
		$str .= $nbsp;
		$f = mysql_fetch_assoc($q);
		if ($f['catalog_folder'] == 1) {
			$str .= 'c'.$f['catalog_name']."<br>";
			$str .= tree($f['catalog_id'], $current+1);
		} else {
			$str .= "f".$f['catalog_name']."<br>";
		}
	}
	return $str;
}
print tree();
-~{}~ 25.10.05 19:44:

Помогите оптимизировать данную функцию, так при количестве пунктов равным 800 в дереве скрипт выполняется уже более секунды, а пунктов будет более 3000....
 

Dreammaker

***=Ф=***
попробуй так (если я правилно понял, что оно должно делать :) ):
PHP:
function tree ($id=0, $current=1) {
        $str = '';
        $nbsp = '';
        for ($i=1; $i<$current; $i++) {$nbsp .= '&nbsp;&nbsp;&nbsp;';}
        $q = db_query("SELECT * FROM `".SQL_PREFIX."catalog` WHERE catalog_parent='".$id."' ORDER BY !catalog_folder,catalog_name");
  if (mysql_num_rows($q)>0) {
        while ($f=mysql_fetch_array($q) {
                $str .= $nbsp;
                if ($f['catalog_folder'] == 1) {
                        $str .= 'c'.$f['catalog_name']."<br>";
                        $str .= tree($f['catalog_id'], $current+1);
                } else {
                        $str .= "f".$f['catalog_name']."<br>";
                }
        }
        }
        return $str;
}
print tree();
p.s. а восклицательный знак в ордер та точно необходим?
upd.: только заметил, что тема слегка утратила актуальность..
 

Aidar

Guest
твоя функция выполняется дольше на 38 сотых миллисекунд =)
 
Сверху