Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Изменить вывод списка файлов

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: Есть обычный вывод файлов, сделать рекурсивным
TheRealKos
Отправлено: 14 Января, 2014 - 19:05:15
Post Id



Новичок


Покинул форум
Сообщений всего: 43
Дата рег-ции: Янв. 2014  


Помог: 0 раз(а)




Доброго времени суток. В общем есть такой вот код, который выводит файлы в папке upload/Группа/Логин. Но если в папке Логин есть еще папки, то он и их выведет (а нужно только файлы).
PHP:
скопировать код в буфер обмена
  1. $dir = "upload/".$array2["group"]."/".$array2["login"]."/";
  2.  echo $dir;
  3.  if(is_dir($dir))
  4.  {
  5.     $files = scandir($dir); //сканируем (получаем массив файлов)
  6.     array_shift($files); // удаляем из массива '.'
  7.     array_shift($files); // удаляем из массива '..'
  8.  
  9.     for($i=0; $i<sizeof($files); $i++)
  10.     {
  11.         if($array !== false)
  12.         {
  13.             $s=(array_key_exists($files[$i],$array)==true)?$array[$files[$i]]:'';
  14.         }
  15.             else
  16.             {
  17.                 $s = '';
  18.             }
  19.             echo '<a href="'.$dir.$files[$i].'" title="Скачать файл"> '.$files[$i].'<br></a> '.$s.' ';
  20.     }
  21.  }

Знаю, что можно рекурсией (но как правильно сделать так и не понял). Собственно говоря нашел вот такой код с рекурсией, но как адаптировать не знаю.
PHP:
скопировать код в буфер обмена
  1. function glob_recursive($dir, $mask){
  2.         foreach(glob($dir.'/*') as $filename){
  3.                 if(strtolower(substr($filename, strlen($filename)-strlen($mask), strlen($mask)))==strtolower($mask)) echo $filename."<br>";
  4.                 if(is_dir($filename)) glob_recursive($filename, $mask);
  5.         }
  6. }
  7. glob_recursive("upload/".$array2["group"]."/".$array2["login"]."/", ".doc");

Ругается на строчки function glob_recursive($dir, $mask){ с ошибкой Fatal error: Cannot redeclare glob_recursive() (previously declared in ). И на foreach(glob($dir.'/*') as $filename){ с ошибкой (Warning: Invalid argument supplied for foreach() in
И как изменить в маске, чтобы искал не только форматы .doc, но и .docx?
 
 Top
gefard
Отправлено: 14 Января, 2014 - 20:43:14
Post Id



Гость


Покинул форум
Сообщений всего: 64
Дата рег-ции: Март 2012  


Помог: 1 раз(а)




PHP:
скопировать код в буфер обмена
  1.  
  2. if(is_file($dir.$files[$i]))
  3. echo '<a href="'.$dir.$files[$i].'" title="Скачать файл"> '.$files[$i].'<br></a>
  4.  
 
 Top
TheRealKos
Отправлено: 14 Января, 2014 - 21:37:12
Post Id



Новичок


Покинул форум
Сообщений всего: 43
Дата рег-ции: Янв. 2014  


Помог: 0 раз(а)




gefard, хм... раньше выводил папки, теперь же вообще ни чего не выводит
 
 Top
DeepVarvar Супермодератор
Отправлено: 15 Января, 2014 - 12:28:26
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Вырезал лишнее:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3.  
  4. /**
  5.  * filesystem utilites
  6.  */
  7.  
  8. abstract class fsUtils {
  9.  
  10.  
  11.     /**
  12.      * WARNING! origin PHP function glob() maybe returned FALSE value!
  13.      * but i'm always expected array!
  14.      */
  15.  
  16.     public static function glob($pattern, $flags = 0) {
  17.  
  18.         if (!$result = glob($pattern, $flags)) {
  19.             $result = array();
  20.         }
  21.         return $result;
  22.  
  23.     }
  24.  
  25.  
  26.     /**
  27.      * recursive glog function
  28.      */
  29.  
  30.     public static function globRecursive($path, $mask = "*") {
  31.  
  32.         $items = self::glob($path . $mask);
  33.         $dirs = self::glob($path . '*', GLOB_ONLYDIR | GLOB_NOSORT);
  34.         foreach ($dirs as $dir) {
  35.             $items = array_merge(
  36.                 $items, self::globRecursive($dir . '/', $mask)
  37.             );
  38.         }
  39.         return $items;
  40.  
  41.     }
  42.  
  43.  
  44. }
  45.  

Использование:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $recursiveFilesCollection = fsUtils::globRecursive('/path/do/dir/', '*');
 
 Top
TheRealKos
Отправлено: 15 Января, 2014 - 16:04:44
Post Id



Новичок


Покинул форум
Сообщений всего: 43
Дата рег-ции: Янв. 2014  


Помог: 0 раз(а)




DeepVarvar пишет:
Вырезал лишнее:

DeepVarvar пишет:
Использование:

А где указать путь? И в маске сделать что бы были только .doc и .docx?
 
 Top
teddy
Отправлено: 15 Января, 2014 - 16:14:40
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




PHP:
скопировать код в буфер обмена
  1.  
  2. $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(__DIR__.'/papka'));
  3. foreach($iterator as $value){
  4.   if(is_file($value)){
  5.     echo $value.'<br />';
  6.   }
  7. }

papka это название папки, с которой нужно начать проход по папкам и подпапкам

(Отредактировано автором: 15 Января, 2014 - 16:15:41)

 
 Top
TheRealKos
Отправлено: 15 Января, 2014 - 16:21:00
Post Id



Новичок


Покинул форум
Сообщений всего: 43
Дата рег-ции: Янв. 2014  


Помог: 0 раз(а)




teddy пишет:
PHP:
скопировать код в буфер обмена
 
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(__DIR__.'/papka'));
foreach($iterator as $value){
  if(is_file($value)){
    echo $value.'<br />';
  }
}
papka это название папки, с которой нужно начать проход по папкам и подпапкам

Если делать тем, что вы предложили, то выдает ОГРОМНУЮ ОШИБКУ: Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(__DIR__upload/1-78-5/cellse/) [<a href='recursivedirectoryiterator.--construct'>recursivedirectoryiterator.--construct</a>]: failed to open dir: No such file or directory' in /ftp_aerium-01/arhivtz_613/arhivtz.gixx.ru/index.php:529 Stack trace: #0 /ftp_aerium-01/arhivtz_613/arhivtz.gixx.ru/index.php(529): RecursiveDirectoryIterator->__construct('__DIR__upload/1...') #1 {main} thrown in.
Ругается на строчку $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(__DIR__."upload/".$array2["group"]."/".$array2["login"]."/"));
 
 Top
teddy
Отправлено: 15 Января, 2014 - 16:24:07
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




TheRealKos
А если прочитать и попробовать вникнуть в смысл ошибки, особенно в эту часть
TheRealKos пишет:
No such file or directory

то можно догадаться что вы неверно указали путь до папки с которой нужно начать рекурсивный проход. Путь нужно указывать относительно скрипта
 
 Top
TheRealKos
Отправлено: 15 Января, 2014 - 16:27:53
Post Id



Новичок


Покинул форум
Сообщений всего: 43
Дата рег-ции: Янв. 2014  


Помог: 0 раз(а)




teddy пишет:
Путь нужно указывать относительно скрипта

Ну это я понимаю, скрипт в корневой папке, а начинать искать нужно с папки /upload/Группа/Логин (но после папки Логин есть еще папки).

(Отредактировано автором: 15 Января, 2014 - 16:28:10)

 
 Top
teddy
Отправлено: 15 Января, 2014 - 16:31:59
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




TheRealKos
значит papka нужно заменить на /upload/Группа/Логин

и не используйте кирилицу в названиях папок
т.е переименуйте /upload/group/login и все должно заработать....
 
 Top
TheRealKos
Отправлено: 15 Января, 2014 - 16:34:54
Post Id



Новичок


Покинул форум
Сообщений всего: 43
Дата рег-ции: Янв. 2014  


Помог: 0 раз(а)




teddy пишет:
значит papka нужно заменить на /upload/Группа/Логин

Я заменил, вот так вот идет: "upload/".$array2["group"]."/".$array2["login"]."/". Группа состоит из чисел, а Логин из английских букв.
 
 Top
imya
Отправлено: 15 Января, 2014 - 16:39:40
Post Id



Участник


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Сент. 2012  
Откуда: Запорожье, Украина


Помог: 19 раз(а)




А если у вас придут пустые
$array2["group"]
$array2["login"]
?


-----
PHP:
скопировать код в буфер обмена
  1. do {box != cat;} while (cat != box);


Когда нормальный человек, уезжая из дома одевает на жену пояс верности, веб-дизайнер ставит на нее счетчик...
 
My status
 Top
teddy
Отправлено: 15 Января, 2014 - 16:40:58
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Вообщем я не знаю что вы делаете если честно объяснил как мог вариант очень даже рабочий вероятно вы что то делаете не так... попробую ещё раз объяснить

Все просто.
1. Указываем путь относительно скрипта в первой строчке(путь без кирилицы)
2. Запускаем скрипт и радуемся
 
 Top
TheRealKos
Отправлено: 15 Января, 2014 - 16:45:29
Post Id



Новичок


Покинул форум
Сообщений всего: 43
Дата рег-ции: Янв. 2014  


Помог: 0 раз(а)




imya пишет:
А если у вас придут пустые
$array2["group"]
$array2["login"]
?

Они не бывают пустые
 
 Top
gefard
Отправлено: 15 Января, 2014 - 17:08:01
Post Id



Гость


Покинул форум
Сообщений всего: 64
Дата рег-ции: Март 2012  


Помог: 1 раз(а)




TheRealKos пишет:
gefard, хм... раньше выводил папки, теперь же вообще ни чего не выводит

Действительно тяжелый случай
У ВАС ТАК????
PHP:
скопировать код в буфер обмена
  1.  
  2. $dir = "upload/".$array2["group"]."/".$array2["login"]."/";
  3.  
  4.  echo $dir;
  5.  
  6.  if(is_dir($dir))
  7.  
  8.  {
  9.  
  10.     $files = scandir($dir); //сканируем (получаем массив файлов)
  11.  
  12.     array_shift($files); // удаляем из массива '.'
  13.  
  14.     array_shift($files); // удаляем из массива '..'
  15.  
  16.  
  17.  
  18.     for($i=0; $i<sizeof($files); $i++)
  19.  
  20.     {
  21.  
  22.         if($array !== false)
  23.  
  24.         {
  25.  
  26.             $s=(array_key_exists($files[$i],$array)==true)?$array[$files[$i]]:'';
  27.  
  28.         }
  29.  
  30.             else
  31.  
  32.             {
  33.  
  34.                 $s = '';
  35.  
  36.             }
  37.  
  38.  
  39. if(is_file($dir.$files[$i])) echo '<a href="'.$dir.$files[$i].'" title="Скачать файл"> '.$files[$i].'<br></a> '.$s.' ';
  40.  
  41.     }
  42.  
  43.  }
  44.  
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с файловой системой и файлами »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB