|
 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
)
|
а надо как во вложении | |
|
|
|
|
|
|
|
для: 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) > 0 ) {
return $folders;
} else {
return null;
}
}
print "<pre>";
print_r(Tree($DOCUMENT_ROOT."/"));
|
| |
|
|
|
|
|
|
|
для: Саня
(13.01.2010 в 16:40)
| | Спасибо! Понял | |
|
|
|
|
|
|
|
для: Саня
(13.01.2010 в 16:40)
| | а как теги <UL> <LI> или <DL> <DD> добавить? | |
|
|
|
|
|
|
|
для: 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(".");
|
| |
|
|
|
|
|
|
|
для: Саня
(13.01.2010 в 16:53)
| | слушай я вижу ты сталкивался с деревьями, подскажи правильно ли я понимаю.
Допустим мне необходимо сделать динамическое дерево, обрабатывать его в потоке, с возможностью разворачивать сворачивать ветви.
Значит я так понимаю, я делаю все теги в виде ссылок, нажимая на ссылку идет передача методом GET.. передается id разворачиваемой ветки, при этом в другом потоке я передаю остаток массива.
Правильно? | |
|
|
|
|
|
|
|
для: freeing
(13.01.2010 в 17:02)
| | > обрабатывать его в потоке ... при этом в другом потоке я передаю остаток массива
То бишь раскрывать с подгрузкой через AJAX? | |
|
|
|
|
|
|
|
для: Саня
(13.01.2010 в 17:07)
| | нет, я имею введу, первый поток это текущий массив где каждый элемент имеет свой ID, второй это переменная c номером ID раскрываемой ветки, которая передается методом GET | |
|
|
|
|
|
|
|
для: freeing
(13.01.2010 в 17:10)
| | первый поток - это отклик сервера.
А второй - это следующий (по ссылке) запрос клиента.
Может проще их так и именовать (запросом и откликом) ? | |
|
|
|
|
|
|
|
для: Trianon
(13.01.2010 в 17:23)
| | может и так ))
мне пожалуйста пятый отклик по третьему запросу ))))))))))))) | |
|
|
|
|
|
|
|
для: freeing
(13.01.2010 в 17:02)
| | короче раскрывающийся список, только не AJAX а через GET | |
|
|
|
|
|
|
|
для: 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("..");
|
| |
|
|
|
|
|
|
|
для: Саня
(13.01.2010 в 17:31)
| | гениально!!!!!!!!!!!!
а можно чтобы развернутые меню не сворачивались при использовании другой ветки? | |
|
|
|
|
|
|
|
для: freeing
(13.01.2010 в 17:33)
| | Можно, но намного проще это сделать аяксом. | |
|
|
|
|
|
|
|
для: Саня
(13.01.2010 в 17:34)
| | ну ладно ОГРОМНОЕ Тебе Спасибо!!!! | |
|
|
|
|
|
|
|
для: Саня
(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);
?>
|
| |
|
|
|
|
|
|
|
для: freeing
(14.01.2010 в 09:46)
| | path можно выдрать из $_SERVER['REQUEST_URI'] | |
|
|
|
|
|
|
|
для: Саня
(14.01.2010 в 14:03)
| | он не работает внутри!
foreach($scandir as $name)
{
...
}
|
| |
|
|
|
|
|
|
|
для: freeing
(14.01.2010 в 14:08)
| | Для начала сделайте href у ссылки: ?path='.urlencode($path).'
Потом посмотрите что находится в переменной $_SEVRER['REQUEST_URI'] при переходе по ссылке. | |
|
|
|
|
|
|
|
для: Саня
(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 *
|
| |
|
|
|
|
|
|
|
для: freeing
(14.01.2010 в 14:23)
| | $_SERVER["REQUEST_URI"] не массив, а обычная строка. | |
|
|
|
|
|
|
|
для: Саня
(14.01.2010 в 14:24)
| | разобрать ее выражением и кинуть вместо $_GET["path"]? | |
|
|
|
|
|
|
|
для: freeing
(14.01.2010 в 14:28)
| | Да. | |
|
|
|
|
|
|
|
для: Саня
(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");
?>
|
| |
|
|
|
|
|
|
|
для: freeing
(14.01.2010 в 14:35)
| | Во-первых, к результату выдирания нужно применить urldecode. Во-вторых, область видимости переменной $URI локальная, поэтому нельзя её использовать в функции. | |
|
|
|
|
|
|
|
для: Саня
(14.01.2010 в 14:49)
| | короче! что делать ) | |
|
|
|
|
|
|
|
для: freeing
(14.01.2010 в 15:01)
| | К $URI[1][0] применить urldecode.
Объявить переменную $URI глобальной.
Документация по области видимости переменных: http://docs.php.net/manual/ru/language.variables.scope.php | |
|
|
|
|
|
|
|
для: Саня
(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");
?>
|
| |
|
|
|
|
|
|
|
для: freeing
(14.01.2010 в 15:25)
| | strpos потерялся.
Внимательнее надо быть. И перед тем как бежать на форум, попробуйте сначала самостоятельно решить проблему. | |
|
|
|
|
|
|
|
для: Саня
(14.01.2010 в 15:29)
| | это что? - strpos | |
|
|
|
|
|
|
|
для: freeing
(14.01.2010 в 15:31)
| | Название функции | |
|
|
|
|
|
|
|
для: Саня
(13.01.2010 в 17:34)
| | !? | |
|
|
|