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

Форум PHP

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

 

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

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

тема: рекурсивное дерево файлов
 
 автор: freeing   (13.01.2010 в 16:27)   письмо автору
63.8 Кб
 
 

Здравствуйте!

Помогите реализовать дерево каталогов,
запутался в массивах, может кто сталкивался...

Делаю так:


<?php
$DOCUMENT_ROOT 
$_SERVER["DOCUMENT_ROOT"];

function 
Tree($folder)
{
     if (
is_dir($folder))
     {
          
$opendir opendir($folder);

          if(
$opendir)
          {
               while ((
$name readdir($opendir)) !== false
               {
                    if(
$name !== "." && $name !== "..")
                    {
                         if (
is_dir($folder."/".$name))
                         {
                              
$folders[] = $name;

                              
Tree($folder."/".$name);
                         }
                    }
               }
          }

          
closedir($opendir);
     }

     print 
"<pre>";
     
print_r($folders);
}

$Tree Tree($DOCUMENT_ROOT."/");
?>


Получаю:


Array
(
    [0] => 1.1
)
Array
(
    [0] => 2.2.1
    [1] => 2.2.2
    [2] => 2.2.3
    [3] => 2.2.4
    [4] => 2.2.5
)
Array
(
    [0] => 2.1
    [1] => 2.2
    [2] => 2.3
)
Array
(
    [0] => 3.1
)
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)


а надо как во вложении

  Ответить  
 
 автор: Саня   (13.01.2010 в 16:40)   письмо автору
 
   для: freeing   (13.01.2010 в 16:27)
 

Так нужно складывать их в единый массив, а не тут же выдавать на печать
<?php
$DOCUMENT_ROOT 
$_SERVER["DOCUMENT_ROOT"];
function 
Tree($folder)
{
     if (
is_dir($folder))
     {
          
$opendir opendir($folder);

          if(
$opendir)
          {
               while ((
$name readdir($opendir)) !== false)
               {
                    if(
$name !== "." && $name !== "..")
                    {
                         if (
is_dir($folder."/".$name))
                         {
                              
$folders[$name] = Tree($folder."/".$name);
                         }
                    }
               }
          }

          
closedir($opendir);
     }


     if ( isset(
$folders) && count($folders) > ) {
         return 
$folders;
     } else {
         return 
null;
     }
}
 print 
"<pre>";
print_r(Tree($DOCUMENT_ROOT."/"));

  Ответить  
 
 автор: freeing   (13.01.2010 в 16:46)   письмо автору
 
   для: Саня   (13.01.2010 в 16:40)
 

Спасибо! Понял

  Ответить  
 
 автор: freeing   (13.01.2010 в 16:50)   письмо автору
 
   для: Саня   (13.01.2010 в 16:40)
 

а как теги <UL> <LI> или <DL> <DD> добавить?

  Ответить  
 
 автор: Саня   (13.01.2010 в 16:53)   письмо автору
 
   для: freeing   (13.01.2010 в 16:50)
 

Например так:
<?
function Tree($folder){
  if ( 
is_dir($folder) ) {
    
$opendir opendir($folder);
    if ( 
$opendir ) {
      print 
'<ul>';
      while ( (
$name readdir($opendir)) !== false ) {
        if ( 
$name !== "." && $name !== ".." ) {
          if ( 
is_dir($folder."/".$name) ) {
            print 
'<li>'.$name.'</li>';
            
Tree($folder."/".$name);
          }
        }
      }
      print 
'</ul>';
    }
    
closedir($opendir);
  }
}
Tree(".");

  Ответить  
 
 автор: freeing   (13.01.2010 в 17:02)   письмо автору
 
   для: Саня   (13.01.2010 в 16:53)
 

слушай я вижу ты сталкивался с деревьями, подскажи правильно ли я понимаю.

Допустим мне необходимо сделать динамическое дерево, обрабатывать его в потоке, с возможностью разворачивать сворачивать ветви.

Значит я так понимаю, я делаю все теги в виде ссылок, нажимая на ссылку идет передача методом GET.. передается id разворачиваемой ветки, при этом в другом потоке я передаю остаток массива.

Правильно?

  Ответить  
 
 автор: Саня   (13.01.2010 в 17:07)   письмо автору
 
   для: freeing   (13.01.2010 в 17:02)
 

> обрабатывать его в потоке ... при этом в другом потоке я передаю остаток массива
То бишь раскрывать с подгрузкой через AJAX?

  Ответить  
 
 автор: freeing   (13.01.2010 в 17:10)   письмо автору
 
   для: Саня   (13.01.2010 в 17:07)
 

нет, я имею введу, первый поток это текущий массив где каждый элемент имеет свой ID, второй это переменная c номером ID раскрываемой ветки, которая передается методом GET

  Ответить  
 
 автор: Trianon   (13.01.2010 в 17:23)   письмо автору
 
   для: freeing   (13.01.2010 в 17:10)
 

первый поток - это отклик сервера.
А второй - это следующий (по ссылке) запрос клиента.
Может проще их так и именовать (запросом и откликом) ?

  Ответить  
 
 автор: freeing   (13.01.2010 в 17:26)   письмо автору
 
   для: Trianon   (13.01.2010 в 17:23)
 

может и так ))

мне пожалуйста пятый отклик по третьему запросу )))))))))))))

  Ответить  
 
 автор: freeing   (13.01.2010 в 17:18)   письмо автору
 
   для: freeing   (13.01.2010 в 17:02)
 

короче раскрывающийся список, только не AJAX а через GET

  Ответить  
 
 автор: Саня   (13.01.2010 в 17:31)   письмо автору
 
   для: freeing   (13.01.2010 в 17:18)
 

Как-то так:
<?php
function Tree($folder) {
  if ( 
is_dir($folder) ) {
    
$opendir opendir($folder);
    if ( 
$opendir ) {
      print 
'<ul>';
      while ( (
$name readdir($opendir)) !== false ) {
        if ( 
$name !== '.' && $name !== '..' ) {
          
$path $folder.'/'.$name;
          if ( 
is_dir($path) ) {
            print 
'<li><a href="?path='.urlencode($path).'">'.$name.'</a></li>';
            if ( isset(
$_GET['path']) && strpos($_GET['path'], $path) !== false ) {
              
Tree($path);
            }
          }
        }
      }
      print 
'</ul>';
    }
  }
}
Tree("..");

  Ответить  
 
 автор: freeing   (13.01.2010 в 17:33)   письмо автору
 
   для: Саня   (13.01.2010 в 17:31)
 

гениально!!!!!!!!!!!!

а можно чтобы развернутые меню не сворачивались при использовании другой ветки?

  Ответить  
 
 автор: Саня   (13.01.2010 в 17:34)   письмо автору
 
   для: freeing   (13.01.2010 в 17:33)
 

Можно, но намного проще это сделать аяксом.

  Ответить  
 
 автор: freeing   (13.01.2010 в 17:35)   письмо автору
 
   для: Саня   (13.01.2010 в 17:34)
 

ну ладно ОГРОМНОЕ Тебе Спасибо!!!!

  Ответить  
 
 автор: freeing   (14.01.2010 в 09:46)   письмо автору
 
   для: Саня   (13.01.2010 в 17:34)
 

У меня еще вопрос возник!

Я использую адреса типа:


http://www.example.com/view/
http://www.example.com/user/
http://www.example.com/tree/


через .htaccess – RewriteRule:


DirectoryIndex /.php/default.php

RewriteEngine on
RewriteBase /.php/
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ default.php?$1 [L]


проще говоря с $_GET['path'] это я загнул, подскажи как сделать тоже самое через сессии $_SESSION['path'].

Как в моем случае передать сессию по ссылке? (или может с подскажешь как через RewriteRule сделать)


<?php
    session_start
();

    
$DOCUMENT_ROOT $_SERVER["DOCUMENT_ROOT"];

    function 
Tree($folder)
    {
        if ( 
is_dir($folder)) 
        {
            
$scandir scandir($folder);

            if (
$scandir)
            {
                print 
"<dl>";

                foreach(
$scandir as $name)
                {
                    if(
$name !== "." && $name !== "..")
                    {
                        
$path $folder.'/'.$name."/";

                        if(
is_dir($path))
                        {
                            
$_SESSION["path"] = $path;

                            print 
"<dd><a href=\"\">".$name."</a></dd>";

                            if (isset(
$_SESSION["path"]) && strpos($_SESSION["path"], $path) !== false)
                            {
                                
Tree ($path);
                            }
                        }
                    }
                }

                print 
"</dl>"
            }
        }
    }

    
Tree($DOCUMENT_ROOT);
?>

  Ответить  
 
 автор: Саня   (14.01.2010 в 14:03)   письмо автору
 
   для: freeing   (14.01.2010 в 09:46)
 

path можно выдрать из $_SERVER['REQUEST_URI']

  Ответить  
 
 автор: freeing   (14.01.2010 в 14:08)   письмо автору
 
   для: Саня   (14.01.2010 в 14:03)
 

он не работает внутри!


                foreach($scandir as $name) 
                { 
                               ... 
                }

  Ответить  
 
 автор: Саня   (14.01.2010 в 14:12)   письмо автору
 
   для: freeing   (14.01.2010 в 14:08)
 

Для начала сделайте href у ссылки: ?path='.urlencode($path).'
Потом посмотрите что находится в переменной $_SEVRER['REQUEST_URI'] при переходе по ссылке.

  Ответить  
 
 автор: freeing   (14.01.2010 в 14:23)   письмо автору
 
   для: Саня   (14.01.2010 в 14:12)
 

$REQUEST_URI = $_SERVER["REQUEST_URI"];

foreach($REQUEST_URI as $uri)
{
    print $uri;
}


выдает

Warning: Invalid argument supplied for foreach() in Z:\home\example.com\www\.php\default.php on line *

  Ответить  
 
 автор: Саня   (14.01.2010 в 14:24)   письмо автору
 
   для: freeing   (14.01.2010 в 14:23)
 

$_SERVER["REQUEST_URI"] не массив, а обычная строка.

  Ответить  
 
 автор: freeing   (14.01.2010 в 14:28)   письмо автору
 
   для: Саня   (14.01.2010 в 14:24)
 

разобрать ее выражением и кинуть вместо $_GET["path"]?

  Ответить  
 
 автор: Саня   (14.01.2010 в 14:30)   письмо автору
 
   для: freeing   (14.01.2010 в 14:28)
 

Да.

  Ответить  
 
 автор: freeing   (14.01.2010 в 14:35)   письмо автору
 
   для: Саня   (14.01.2010 в 14:30)
 

не пашет!

<?php
    $DOCUMENT_ROOT 
$_SERVER["DOCUMENT_ROOT"];
    
$REQUEST_URI $_SERVER["REQUEST_URI"];

    
preg_match_all("/path=(.*)\//is"$REQUEST_URI$URI);

    function 
Tree($dir)
    {
        if(isset(
$dir))
        {
            if (
is_dir($dir)) 
            {
                
$scandir scandir($dir);

                if(
is_array($scandir))
                {
                    print 
"<dl>";

                    foreach(
$scandir as $scandir)
                    {
                        if(
$scandir !== "." && $scandir !== "..")
                        {
                            
$path $dir.'/'.$scandir;

                            if(
is_dir($path))
                            {
                                print 
"<dd><a href=\"?path=".urlencode($path)."/\">".$scandir."</a></dd>";

                                if (isset(
$URI[1][0]) && strpos($URI[1][0], $path) !== false)
                                {
                                    
Tree ($path);
                                }
                            }
                        }
                    }

                    print 
"</dl>";
                }
            }
        }
    }

    
Tree($DOCUMENT_ROOT."/.txt");
?>

  Ответить  
 
 автор: Саня   (14.01.2010 в 14:49)   письмо автору
 
   для: freeing   (14.01.2010 в 14:35)
 

Во-первых, к результату выдирания нужно применить urldecode. Во-вторых, область видимости переменной $URI локальная, поэтому нельзя её использовать в функции.

  Ответить  
 
 автор: freeing   (14.01.2010 в 15:01)   письмо автору
 
   для: Саня   (14.01.2010 в 14:49)
 

короче! что делать )

  Ответить  
 
 автор: Саня   (14.01.2010 в 15:10)   письмо автору
 
   для: freeing   (14.01.2010 в 15:01)
 

К $URI[1][0] применить urldecode.
Объявить переменную $URI глобальной.

Документация по области видимости переменных: http://docs.php.net/manual/ru/language.variables.scope.php

  Ответить  
 
 автор: freeing   (14.01.2010 в 15:25)   письмо автору
 
   для: Саня   (14.01.2010 в 15:10)
 

Что не так?

<?php
    $DOCUMENT_ROOT 
$_SERVER["DOCUMENT_ROOT"];
    
$REQUEST_URI $_SERVER["REQUEST_URI"];

    
preg_match_all("/path=(.*)\//is"$REQUEST_URI$URI);

    
$GLOBALS["ff"] = urldecode($URI[1][0]);

    function 
Tree($dir)
    {
        if(isset(
$dir))
        {
            if (
is_dir($dir)) 
            {
                
$scandir scandir($dir);

                if(
is_array($scandir))
                {
                    print 
"<dl>";

                    foreach(
$scandir as $scandir)
                    {
                        if(
$scandir !== "." && $scandir !== "..")
                        {
                            
$path $dir.'/'.$scandir;

                            if(
is_dir($path))
                            {
                                print 
"<dd><a href=\"?path=".urlencode($path)."/\">".$scandir."</a></dd>";

                                if(isset(
$GLOBALS["ff"]))
                                {
                                    
Tree ($path);
                                }
                            }
                        }
                    }

                    print 
"</dl>";
                }
            }
        }
    }

    
Tree($DOCUMENT_ROOT."/.txt");
?>

  Ответить  
 
 автор: Саня   (14.01.2010 в 15:29)   письмо автору
 
   для: freeing   (14.01.2010 в 15:25)
 

strpos потерялся.
Внимательнее надо быть. И перед тем как бежать на форум, попробуйте сначала самостоятельно решить проблему.

  Ответить  
 
 автор: freeing   (14.01.2010 в 15:31)   письмо автору
 
   для: Саня   (14.01.2010 в 15:29)
 

это что? - strpos

  Ответить  
 
 автор: Саня   (14.01.2010 в 15:44)   письмо автору
 
   для: freeing   (14.01.2010 в 15:31)
 

Название функции

  Ответить  
 
 автор: freeing   (14.01.2010 в 13:11)   письмо автору
 
   для: Саня   (13.01.2010 в 17:34)
 

!?

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

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