в общем есть у меня такие функции:
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й директивы и началом другой
Никакого эффекта
У меня ощущение, что ошибка появляется из за функции глобал.
Сейчас заметил, что ошибки появляются между окончанием сканирования 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 файл из каждой папки...
повилс вывод файлов, но не полный, далеко не полный...
о, заметил, выводит 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>';
}
_____________
Там где есть новички, есть и двигатель прогресса!!!
Ну, если не сказать больше=)