[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: scandir подкаталоги подкаталогов
inpost
Помогите разобраться. Как тут правильно назвать переменные, чтоб функция изнутри вызывала саму себя, при этом получался общий вид. Сейчас сканируется папка, если внутри папка - запускается снова, но после запуска функция не проходит саму себя полностью.
Внутри запускается всё по кругу этим коротким кодом:
$files2 = allDir("./".$v);
foreach ($files2 as $k=>$v)
{
$file[] = $v;
}

Ну а если внутри этой папки есть другая подпапка, то надо снова прописывать опять этот же код:
$files3 = allDir("./".$v);
foreach ($files3 as $k=>$v)
{
$file[] = $v;
}


Помогите исправить этот код. Внутри папки проходили другие подпапки.

function allDir($dir)
{
$files = scandir($dir);
unset($files[0],$files[1]);

foreach($files as $k=>$v)
{
if (is_dir($v))
{
$files2 = allDir("./".$v);
foreach ($files2 as $k=>$v)
{
$file[] = $v;
}
}

else {$file[] = $dir."/".$v;}
}

return $file;
}
$start = '.';
$files = allDir($start);
echo "<pre>";
print_r ($files);
echo "</pre>";
exit();


Если верхний код сканирует эту папку и вложенные папки, то следующий уже сканирует эту папку, папки внутри этой папки, и подпапки. А я хотел бы увидеть, как такое реализовать на бесконечное число подпапок.

function allDir($dir)
{
$files = scandir($dir);
unset($files[0],$files[1]);

foreach($files as $k=>$v)
{
if (is_dir($v))
{
$files2 = allDir("./".$v);
foreach ($files2 as $k=>$v)
{
if (is_dir($v))
{
$files3 = allDir($v);
foreach ($files3 as $k=>$v)
{
$file[] = $v;
}
}

else {$file[] = $v;}
}
}

else {$file[] = $dir."/".$v;}
}

return $file;
}
$start = '.';
$files = allDir($start);
echo "<pre>";
print_r ($files);
echo "</pre>";
exit();




Спустя 44 минуты, 57 секунд (31.10.2010 - 17:23) linker написал(а):
function AllDir($Folder, &$Files)
{
if (!($hdl = opendir($Folder))) return;
while(($file = readdir($hdl)) !== false)
{
if ($file == '.' || $file == '..') continue;
$FullPath = $Folder . '/' . $file;
$Files[] = $FullPath;
if (is_dir($FullPath))
AllDir($FullPath, $Files);
}
closedir($hdl);
}
$StartDir = ".";
$Files = array();
AllDir($StartDir, $Files);
print_r($Files);
Второй вариант со scandir
function AllDir($Folder, &$Files)
{
$result = scandir($Folder);
foreach($result as $file)
{
if ($file == '.' || $file == '..') continue;
$FullPath = $Folder . '/' . $file;
$Files[] = $FullPath;
if (is_dir($FullPath)) AllDir($FullPath, $Files);
}
}

$StartDir = ".";
$Files = array();
AllDir($StartDir, $Files);
print_r($Files);

Спустя 1 час, 55 минут, 5 секунд (31.10.2010 - 19:18) inpost написал(а):
linker
Спасибо, что значит символ: & ? Что он обозначает (&$Files)? А так же почему нету return $Files? Это как-то связано, или я чего-то не понимаю?

Спустя 13 минут, 32 секунды (31.10.2010 - 19:32) Guest написал(а):
У новичка понятней и правильней
$files = allDir($start);
чем у linker
$Files = array();
AllDir($StartDir, $Files);
Сложность не есть сестра мудрости.

Спустя 4 минуты, 39 секунд (31.10.2010 - 19:36) Guest написал(а):
Потому как массив $files локален для функции и если смотреть с точки проектировки, то он есть свойство объекта catalog что соответствено локально. С точки зрения интерпритатора - в первом случае она удаляется при окончании работы функции, во втором висит до конца скрипта. Здесь это не критично но всё же если такие вещи в больший скриптах, есть опасность со "мусором".

Спустя 33 секунды (31.10.2010 - 19:37) Michael написал(а):
Цитата (inpost @ 31.10.2010 - 18:18)
linker
Спасибо, что значит символ: & ? Что он обозначает (&$Files)? А так же почему нету return $Files? Это как-то связано, или я чего-то не понимаю?

Да, связано. Передача переменной по ссылке - изменения в функции сохраняются в переменной, переданной таким образом. Объекты например в php5 по умолчанию уже передаются по ссылке.

Спустя 25 минут, 54 секунды (31.10.2010 - 20:03) inpost написал(а):
Это классно, а я уже думал сегодня утром копать в сторону глобальных переменных, чтобы можно было бы к ним в функции обращаться. Собственно эфект такой же, но эта реализация классная. Всем спасибо, переделал немного мой скрипт, теперь его рабочий вид такой:
function allDir($dir,&$files)
{
$result = scandir($dir);
unset($result[0],$result[1]);
foreach($result as $v)
{
if (is_dir($dir."/".$v))
{
allDir($dir."/".$v,$files);
}
else
{
$files[] = $dir."/".$v;
}
}
}

$start = ".";
$files = array();
allDir($start,$files);
echo "<pre>";
print_r ($files);
echo "</pre>";
exit();

Спустя 14 часов, 6 минут, 53 секунды (1.11.2010 - 10:10) linker написал(а):
&$Files - передача по ссылке, передается не значение переменной, а только ссылка на нее. В данном случае, т.к. есть массив, это избавляет от кучи геммора.

А тебе нужны только файлы?


_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Быстрый ответ:

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