[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: рекурсивное сканирование
brainraider
Понимаю, что ничего нового не придумываю, что все это обсуждалось, но конкретно такого вопроса не видел =)

в общем есть у меня такие функции:
function scan_dir($path)	{
$files_one_dir = glob($path.'/*');
return $files_one_dir;
}

function recursive_scan_dir($path) {
$files_one_dir = $this->scan_dir($path);
$i = 0;
foreach($files_one_dir as $file_or_dir) {
if(is_dir($file_or_dir)) {
$dirs[$i] = $file_or_dir;
$this->recursive_scan_dir($dirs[$i]);
$i++;
}
else $files[$file_or_dir] = $file_or_dir;
}
foreach($files as $v) echo $v.'<br>'; [b](232 строка!!!)[/b]
}


форыч стоит для отладки. в общем все нормально получается, создается массив, но вот как он выводится при использовании print_r;
Array(bla bla bla) Array(bla bla bla bla) .. и т.д.


а вот при выводе форычем нормально выписывает путь, но переодически кидает ошибку:
Warning: Invalid argument supplied for foreach() in (путь) on line 232

foreach($files as $v)	echo $v.'<br>';
(232 строка!!!)

при всем этом ошиька не перекрывает выводимые данные...

что это может быть, как от этого избавиться?

Заранее благодарен!



Спустя 5 часов, 34 минуты, 51 секунда (12.01.2011 - 09:45) linker написал(а):
Здесь уже много раз рисовали алгоритмы обхода дерева каталогов. Но в твоем случае поможет банальная инициализация массива, перед
foreach($files_one_dir as $file_or_dir)	{ ...
допиши
$files = array();

Спустя 5 минут, 49 секунд (12.01.2011 - 09:51) brainraider написал(а):
2linker,
Никакого эффекта

У меня ощущение, что ошибка появляется из за функции глобал.

Сейчас заметил, что ошибки появляются между окончанием сканирования 1й директивы и началом другой

Спустя 21 минута, 38 секунд (12.01.2011 - 10:12) linker написал(а):
Ошибка появляется потому, что $files не массив. При каждом вызове recursive_scan_dir() данный массив инициализируется только в случае нахождения хотя бы одного файла. Если папка пустая, то $files грубо говоря равно null, а значит foreach($files) будет давать ошибку, которую ты собственно и получаешь.

Спустя 9 минут, 41 секунда (12.01.2011 - 10:22) brainraider написал(а):
В общем вот, что получилось:

 function scan_dir($path)	{
$files_one_dir = glob($path.'/*');
return $files_one_dir;
}

function recursive_scan_dir($path) {
$files = Array();
$files_one_dir = $this->scan_dir($path);
foreach($files_one_dir as $file_or_dir) {
if(is_dir($file_or_dir))
$this->recursive_scan_dir($file_or_dir);
else
$files[$file_or_dir] = $file_or_dir;
}
$files = $this->simple_path($files,ROOT_DIR);
foreach($files as $v) echo $v.'<br>';
}


Ошибка все равно осталась, но если

function recursive_scan_dir($path)	{
$files = Array();
$files_one_dir = $this->scan_dir($path);
foreach($files_one_dir as $file_or_dir) {
if(is_dir($file_or_dir))
echo $file_or_dir; #тут все выводится нормаольно!!!!!

Спустя 3 часа, 57 минут, 18 секунд (12.01.2011 - 14:19) brainraider написал(а):
В общем вот! Жду пояснений спецов =)

Спустя 24 минуты, 58 секунд (12.01.2011 - 14:44) linker написал(а):
if(is_dir($file_or_dir)) 
echo $file_or_dir; #тут все выводится нормаольно!!!!!
а фигли ему тут не выводится, если это папка, которая может быть и пустая.
class A
{
...

function recursive_scan_dir($path)
{
$files = array();
$files_one_dir = scandir($path);
foreach($files_one_dir as $file_or_dir)
{
if(is_dir($path . '/' . $file_or_dir))
$this->recursive_scan_dir($path . '/' . $file_or_dir);
else
$files[] = $file_or_dir;
}
foreach($files as $file) echo $file . '<br>';
}

...
}
Дальше сам думай и спрашивай если что.

Спустя 12 часов, 12 минут, 22 секунды (13.01.2011 - 02:57) brainraider написал(а):
2linker,
В предложенном варианте выводится содержимое только первой папки, понятное дело, что там что-то нужно подправить, но пока сидел на работе наткнулся на одно интересное решение и попробовал сделать:

function scan_dir($path)	{
$files_one_dir = glob($path.'/*');
return $files_one_dir;
}

function recursive_scan_dir($path) {
$files = Array();
$files_one_dir = $this->scan_dir($path);
$is_empty = count($files_one_dir);
if($is_empty!=0) {
foreach($files_one_dir as $file_or_dir) {

if(is_dir($file_or_dir))
$this->recursive_scan_dir($file_or_dir);
else
$files[] = $file_or_dir;
}
}

$files = $this->simple_path($files,ROOT_DIR);
foreach($files as $v) echo '<pre>'.$v.'</pre><br>';


}

function simple_path($paths,$cute) {
foreach($paths as $key => $path) {
if($key == $path) $key = str_replace($cute,'',$key);
$path = str_replace($cute,'',$path);
$new_paths[$key] = $path;
}
return $new_paths;
}


и все равно ошибки.
всевозможные условия, запрещающие обработку пустых папок эффекта не дают...

Спустя 16 минут, 48 секунд (13.01.2011 - 03:14) alias написал(а):
Быть может Вы не будете надеятся на нашу интуицию и выложите перечень ошибок?

Спустя 6 часов, 18 минут, 10 секунд (13.01.2011 - 09:32) linker написал(а):
Прощу прощения, забыл очень важную деталь
class A
{
...

function recursive_scan_dir($path)
{
$files = array();
$files_one_dir = scandir($path);
foreach($files_one_dir as $file_or_dir)
{
if ($file_or_dir == '.' || $file_or_dir == '..') continue; // Это ОЧЕНЬ важно
if(is_dir($path . '/' . $file_or_dir))
$this->recursive_scan_dir($path . '/' . $file_or_dir);
else
$files[] = $file_or_dir;
}
foreach($files as $file) echo $file . '<br>';
}

...
}

Спустя 1 час, 54 минуты, 45 секунд (13.01.2011 - 11:27) brainraider написал(а):
КОгда делаю так как вы говорите, то визуально ничего не отличается от варианта без этой строки.

Происхдит сканирование только первой директории, причем в массив файлы заносятся не только файлы но и папки (о_О)

Спустя 18 минут, 13 секунд (13.01.2011 - 11:45) linker написал(а):
Один из нас явно гонит. У себя выполняю код
class A
{
function recursive_scan_dir($path)
{
$files = array();
$files_one_dir = scandir($path);
foreach($files_one_dir as $file_or_dir)
{
if ($file_or_dir == '.' || $file_or_dir == '..') continue; // Это ОЧЕНЬ важно
if(is_dir($path . '/' . $file_or_dir))
$this->recursive_scan_dir($path . '/' . $file_or_dir);
else
$files[] = $file_or_dir;
}
foreach($files as $file) echo $file . '<br>';
}
}

$a = new A();
$a->recursive_scan_dir('.');
получаю список все файлов текущей папке и во всех подпапках. Вывод, я не гоню.

Спустя 1 час, 34 минуты, 19 секунд (13.01.2011 - 13:19) brainraider написал(а):
$this->scan_dir() поменял на scandir()
повилс вывод файлов, но не полный, далеко не полный...

о, заметил, выводит 1 файл из каждой папки...

function recursive_scan_dir($path)	{
$files = Array();
$files_one_dir = scandir($path);
foreach($files_one_dir as $file_or_dir) {
if ($file_or_dir == '.' || $file_or_dir == '..') continue;
if(is_dir($path.'/'.$file_or_dir))
$this->recursive_scan_dir($path.'/'.$file_or_dir);
else
$files[$path] = $file_or_dir;
}
//$files = $this->simple_path($files,$path);
//foreach($files as $v) echo '<pre>'.$v.'</pre><br>';

print_r($files);
}

Спустя 1 час, 37 минут, 53 секунды (13.01.2011 - 14:57) linker написал(а):
Показывай, список файлов в папке, а что на выводе при чтении этой папки. Код верный, гадать на кофейной гуще не приучены.

Спустя 5 минут, 59 секунд (13.01.2011 - 15:03) Snus написал(а):
Проверяй массив функцией is_array


if(is_array($array)){
foreach($array as $val){
///bla-bla-bla
}
}


Спустя 1 день, 1 час, 7 минут, 10 секунд (14.01.2011 - 16:10) brainraider написал(а):
прошу прощения =) все сделал, это просто сам запутался...

Вот готовый вариант функции, если у кого-нибудь будут педложения по доработке - пишите!

function recursive_scan_dir($path) {
$files = Array();
$files_one_dir = scandir($path);
if(is_array($files_one_dir)) {
foreach($files_one_dir as $file_or_dir) {
if ($file_or_dir == '.' || $file_or_dir == '..') continue;
if(is_dir($path.'/'.$file_or_dir))
$this->recursive_scan_dir($path.'/'.$file_or_dir);
else
$files[$path][] = $file_or_dir;
}
}

foreach($files as $key => $val) foreach($val as $k => $v)echo '<pre>'.$key.'/'.$v.'</pre><br>';
}


_____________
Там где есть новички, есть и двигатель прогресса!!!
Ну, если не сказать больше=)
Быстрый ответ:

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