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

Форум PHP

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

 

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

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

тема: Дерево - нумерация вложенность
 
 автор: Serg_l   (20.03.2009 в 12:38)   письмо автору
 
 

как привести код обхода директорий (обходит нормально)
к такой нумерации записей:

$id - $dir - $pid (родитель)
1 - /Раздел 1/ - 0
2 - /Раздел 2/ - 0
3 - /Раздел 3/ - 0
4 - /Подраздел 1.1/ - 1
5 - /Подраздел 1.2/ - 1
6 - /Подраздел 2.1/ - 2
7 - /Подподраздел 1.1.1/ - 4

код
  // функция построения дерева сайта - старт-директория
  function parse_dir ($current_dir)
  {
      if ($dir = @opendir($current_dir))
      {
        while ($file = readdir($dir))
        {
            if ($file!="." && $file!=".." && $file!="Thumbs.db")
            {
                if (is_dir($current_dir."/".$file)) 
                {
                    echo "/$file/<br>";
                    $newdir = $current_dir."/".$file."/";
                    chdir($newdir);
                    parse_dir($newdir);
                }
                else 
                {
                    $fls[] = "- $file<br>";
                }
                //for ($i=0; $i<=count($fls); $i++) echo $fls[$i]."<br>";
                unset($fls);
            }
        }
        chdir('..');
        echo "<hr>";
        closedir($dir);
      }
  }
  
  parse_dir ("/");

  Ответить  
 
 автор: Serg_l   (20.03.2009 в 14:34)   письмо автору
 
   для: Serg_l   (20.03.2009 в 12:38)
 

советов хочется, коллеги

  Ответить  
 
 автор: guye   (20.03.2009 в 14:57)   письмо автору
 
   для: Serg_l   (20.03.2009 в 14:34)
 

если я правильно понял то можно смотреть просто степень вложенности папки

  Ответить  
 
 автор: Serg_l   (20.03.2009 в 14:57)   письмо автору
 
   для: guye   (20.03.2009 в 14:57)
 

да, верно, только запутался в нумерации рекурсии

  Ответить  
 
 автор: guye   (20.03.2009 в 15:04)   письмо автору
 
   для: Serg_l   (20.03.2009 в 14:57)
 

а просто что нибудь такое перед echo сделать $b=split(/\//,$file); $b.length

  Ответить  
 
 автор: Serg_l   (20.03.2009 в 15:18)   письмо автору
 
   для: guye   (20.03.2009 в 15:04)
 

Простите, не понял, как это поможет правильной нумерации вложенных элементов

  Ответить  
 
 автор: Serg_l   (20.03.2009 в 15:42)   письмо автору
 
   для: Serg_l   (20.03.2009 в 15:18)
 

есть нерабочая попытка решения и скрин, если поможет понять, что я хочу сделать

  Ответить  
 
 автор: Serg_l   (20.03.2009 в 16:25)   письмо автору
 
   для: Serg_l   (20.03.2009 в 15:42)
 

здесь скрипт вывода дерева - http://www.activex.net.ru/docs/phpdtree.shtml
я хочу сделать обход директорий с правильной нумерацией записей
подскажите, хоть, где копать

  Ответить  
 
 автор: Serg_l   (20.03.2009 в 17:00)   письмо автору
 
   для: Serg_l   (20.03.2009 в 16:25)
 

сделал, но рекурсия считается неверно :(

1 /раздел 1/ 0
2 /раздел 2/ 0
3 /раздел 3/ 0
4 /подраздел 3.1/ 3
4 /раздел 4/ 0 - тут ошибка первая цифра д.б. - 5 - id записи
5 /раздел 5/ 0
6 /раздел 6/ 0
7 /раздел 7/ 0
8 /подраздел 7.1/ 7
9 /подраздел 7.2/ 7
10 /подподраздел 7.2.1/ 9
11 /подподраздел 7.2.2/ 9
12 /подподраздел 7.2.3/ 9

вот код
  function parse_dir ($current_dir,$id,$pid)
  {
      if ($dir = @opendir($current_dir))
      {
        while ($file = readdir($dir))
        {
            if ($file!="." && $file!=".." && $file!="Thumbs.db")
            {
                if (is_dir($current_dir."/".$file)) 
                {
                    echo "$id /$file/ $pid<br>";
                    $newdir = $current_dir."/".$file."/";
                    chdir($newdir);
                    parse_dir($newdir,$id+1,$id++);
                }
                
            }
        }
        chdir('..');
        closedir($dir);
      }
  }
  
  parse_dir ($current_dir,1,0);

  Ответить  
 
 автор: guye   (20.03.2009 в 17:23)   письмо автору
 
   для: Serg_l   (20.03.2009 в 17:00)
 

посмотри это(извени не успел сделать что бы оно нормально работало) если что в понедельник пиши
<?php
function dir_file($papka){
if ($dir_name==$papka){$dir_name="папка с каторой стартуем";}else{$dir_name=$papka; echo "$papka--".count(preg_split ('/\//',$papka))."<br>";}
if (is_dir($dir_name)){
$dir = @opendir($dir_name);
}
$mas=array();
while (@ $file = readdir($dir)){
if ($file!="." and $file!=".."){
# echo "$file<br>";
array_push($mas,$file);
}
}
@ closedir($dir);
foreach ($mas as $file){
#echo "$file<br>";
dir_file("$dir_name/$file");
}
}
dir_file("");
?>

  Ответить  
 
 автор: Serg_l   (20.03.2009 в 17:44)   письмо автору
 
   для: guye   (20.03.2009 в 17:23)
 

спасибо, ваш код нормально обходит директорию, но вопрос в другом
как правильно пронумировать элементы этого обхода?

  Ответить  
 
 автор: guye   (23.03.2009 в 11:10)   письмо автору
 
   для: Serg_l   (20.03.2009 в 17:44)
 

оно ?
<?php
$i=1;
$ch="";
dir_file("",$i);
function dir_file($papka,$ch){
if ($dir_name==$papka){$dir_name="папка с каторой стартуем";}else{$dir_name=$papka; echo "$papka--$ch<br>";}

if (is_dir($dir_name)){
$dir = @opendir($dir_name);
}
$mas=array();
while (@ $file = readdir($dir)){
if ($file!="." and $file!=".."){
# echo "$file<br>";
array_push($mas,$file);
}
}
@ closedir($dir);
foreach ($mas as $file){
$count_ch=count(preg_split ('/\//',"$dir_name/$file"));
#echo "$file<br>";
$mas_ch=array();
$mas_ch=preg_split('/\./',$ch);
$ch="";
for ($i_ch=0;$i_ch<$count_ch-3;$i_ch++){
$ch=$ch.$mas_ch[$i_ch].".";
}
$i+=1;
$ch=$ch.$i;
dir_file("$dir_name/$file",$ch);
}
}
?>

  Ответить  
 
 автор: guye   (23.03.2009 в 11:15)   письмо автору
 
   для: Serg_l   (20.03.2009 в 17:44)
 

оно ?и в этом -3 только если стартуешь с карнивой папки for ($i_ch=0;$i_ch<$count_ch-3;$i_ch++)
<?php
$i=1;
$ch="";
dir_file("",$i);
function dir_file($papka,$ch){
if ($dir_name==$papka){$dir_name="папка с каторой стартуем";}else{$dir_name=$papka; echo "$papka--$ch<br>";}

if (is_dir($dir_name)){
$dir = @opendir($dir_name);
}
$mas=array();
while (@ $file = readdir($dir)){
if ($file!="." and $file!=".."){
# echo "$file<br>";
array_push($mas,$file);
}
}
@ closedir($dir);
foreach ($mas as $file){
$count_ch=count(preg_split ('/\//',"$dir_name/$file"));
#echo "$file<br>";
$mas_ch=array();
$mas_ch=preg_split('/\./',$ch);
$ch="";
for ($i_ch=0;$i_ch<$count_ch-3;$i_ch++){
$ch=$ch.$mas_ch[$i_ch].".";
}
$i+=1;
$ch=$ch.$i;
dir_file("$dir_name/$file",$ch);
}
}
?>

  Ответить  
 
 автор: Trianon   (22.03.2009 в 17:07)   письмо автору
 
   для: Serg_l   (20.03.2009 в 17:00)
 

в таких случаях обычно применяют статическую переменную

<?
function parse($current_dir$pid)
{
      static 
$id;
      if(
$pid 0$id 0;
      
$cid = ++$id;
      if (
$dir = @opendir($current_dir))
      {
        while (
$file readdir($dir))
        {
            if (
$file!="." && $file!=".." && $file!="Thumbs.db" 
               
&&   is_dir($current_dir."/".$file)) 
            {
                echo 
"$id /$file$pid<br>"
                
$newdir $current_dir."/".$file."/";
                
chdir($newdir);
                
parse_dir($newdir,$cid);
            }
        }
        
chdir('..');
        
closedir($dir);
      }


parse_dir ($current_dir,0);

  Ответить  
Rambler's Top100
вверх

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