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
Форумы портала PHP.SU :: Версия для печати :: Изменить вывод списка файлов
Форумы портала PHP.SU » » Работа с файловой системой и файлами » Изменить вывод списка файлов

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

1. TheRealKos - 14 Января, 2014 - 19:05:15 - перейти к сообщению
Доброго времени суток. В общем есть такой вот код, который выводит файлы в папке 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?
2. gefard - 14 Января, 2014 - 20:43:14 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  
  2. if(is_file($dir.$files[$i]))
  3. echo '<a href="'.$dir.$files[$i].'" title="Скачать файл"> '.$files[$i].'<br></a>
  4.  
3. TheRealKos - 14 Января, 2014 - 21:37:12 - перейти к сообщению
gefard, хм... раньше выводил папки, теперь же вообще ни чего не выводит
4. DeepVarvar - 15 Января, 2014 - 12:28:26 - перейти к сообщению
Вырезал лишнее:
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/', '*');
5. TheRealKos - 15 Января, 2014 - 16:04:44 - перейти к сообщению
DeepVarvar пишет:
Вырезал лишнее:

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

А где указать путь? И в маске сделать что бы были только .doc и .docx?
6. teddy - 15 Января, 2014 - 16:14:40 - перейти к сообщению
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 это название папки, с которой нужно начать проход по папкам и подпапкам
7. TheRealKos - 15 Января, 2014 - 16:21:00 - перейти к сообщению
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"]."/"));
8. teddy - 15 Января, 2014 - 16:24:07 - перейти к сообщению
TheRealKos
А если прочитать и попробовать вникнуть в смысл ошибки, особенно в эту часть
TheRealKos пишет:
No such file or directory

то можно догадаться что вы неверно указали путь до папки с которой нужно начать рекурсивный проход. Путь нужно указывать относительно скрипта
9. TheRealKos - 15 Января, 2014 - 16:27:53 - перейти к сообщению
teddy пишет:
Путь нужно указывать относительно скрипта

Ну это я понимаю, скрипт в корневой папке, а начинать искать нужно с папки /upload/Группа/Логин (но после папки Логин есть еще папки).
10. teddy - 15 Января, 2014 - 16:31:59 - перейти к сообщению
TheRealKos
значит papka нужно заменить на /upload/Группа/Логин

и не используйте кирилицу в названиях папок
т.е переименуйте /upload/group/login и все должно заработать....
11. TheRealKos - 15 Января, 2014 - 16:34:54 - перейти к сообщению
teddy пишет:
значит papka нужно заменить на /upload/Группа/Логин

Я заменил, вот так вот идет: "upload/".$array2["group"]."/".$array2["login"]."/". Группа состоит из чисел, а Логин из английских букв.
12. imya - 15 Января, 2014 - 16:39:40 - перейти к сообщению
А если у вас придут пустые
$array2["group"]
$array2["login"]
?
13. teddy - 15 Января, 2014 - 16:40:58 - перейти к сообщению
Вообщем я не знаю что вы делаете если честно объяснил как мог вариант очень даже рабочий вероятно вы что то делаете не так... попробую ещё раз объяснить

Все просто.
1. Указываем путь относительно скрипта в первой строчке(путь без кирилицы)
2. Запускаем скрипт и радуемся
14. TheRealKos - 15 Января, 2014 - 16:45:29 - перейти к сообщению
imya пишет:
А если у вас придут пустые
$array2["group"]
$array2["login"]
?

Они не бывают пустые
15. gefard - 15 Января, 2014 - 17:08:01 - перейти к сообщению
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.  

 

Powered by ExBB FM 1.0 RC1