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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Рекурсивный поиск без маски работает, а с маской нет
ext
Отправлено: 13 Июня, 2011 - 01:00:43
Post Id


Новичок


Покинул форум
Сообщений всего: 32
Дата рег-ции: Июнь 2011  


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




PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. function glob_recursive($dir){
  3.   foreach(glob($dir."*", GLOB_NOSORT) as $filename){
  4.     echo $filename."<br>";
  5.     if(is_dir($filename)) glob_recursive($filename."/*");
  6.   }
  7. }
  8. $dir = "/media/stuff/Music";
  9. glob_recursive($dir);
  10. ?>

Так поиск работает, но стоит сделать маску типа *.txt поиск перестает работать. не могу понять в чем проблема Огорчение

(Отредактировано автором: 13 Июня, 2011 - 01:03:25)

 
 Top
White
Отправлено: 13 Июня, 2011 - 08:58:58
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


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




в 5 строке вы проверяете является ли ресурс $filename каталогом, но в 3 добавляя фильтр (например *.txt), отфильтровываете все каталоги оставляя только файлы с определенным расширением, т.е при добавлении фильтра is_dir($filename) всегда будет равно false, и никакой рекурсии не будет.
(Добавление)
попробуйте вместо фильтра изменить 5 строку

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. if(strtolower(substr($filename, strlen($filename)-4, 4))=='.txt') echo $filename."<br>";
  3.  

(Добавление)
попробуйте вместо фильтра изменить 5 строку

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. if(strtolower(substr($filename, strlen($filename)-4, 4))=='.txt') echo $filename."<br>";
  3.  


-----
if(time()>1356048000) die();
 
 Top
ext
Отправлено: 13 Июня, 2011 - 18:50:59
Post Id


Новичок


Покинул форум
Сообщений всего: 32
Дата рег-ции: Июнь 2011  


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




Не помогло Огорчение
 
 Top
Давит
Отправлено: 13 Июня, 2011 - 20:10:47
Post Id



Частый гость


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


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




по моему должна бит вот так
PHP:
скопировать код в буфер обмена
  1.     <?PHP
  2.     function glob_recursive($dir){
  3.       foreach(glob($dir."*", GLOB_NOSORT) as $filename){
  4.         echo $filename."<br>";
  5.         if(is_dir($filename)) glob_recursive($filename);
  6.       }
  7.     }
  8.     $dir = "/media/stuff/Music";
  9.     glob_recursive($dir);
  10.     ?>
 
 Top
OrmaJever Модератор
Отправлено: 13 Июня, 2011 - 21:05:51
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




ext вы хотите собрать все файлы из всех папок? Однако
PHP:
скопировать код в буфер обмена
  1. function scan($dir)
  2. {
  3.         $d = array();
  4.         $arr = opendir($dir);
  5.  
  6.         while($v = readdir($arr))
  7.         {
  8.                 if($v == '.' or $v == '..') continue;
  9.                 if(!is_dir($v)) $d[] = $v;
  10.                 if(is_dir($v) === true) $d[$v] = scan($dir.DIRECTORY_SEPARATOR.$v);
  11.    }
  12.  
  13.         return $d;
  14. }


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
White
Отправлено: 14 Июня, 2011 - 09:02:42
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


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




можно так:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2.     <?PHP
  3.    function glob_recursive($dir, $mask){
  4.      foreach(glob($dir."/*", GLOB_NOSORT) as $filename){
  5.        if(strtolower(substr($filename, strlen($filename)-strlen($mask), strlen($mask)))==strtolower($mask)) echo $filename."<br>";
  6.        if(is_dir($filename)) glob_recursive($dir.'/'.$filename);
  7.      }
  8.    }
  9.    $dir = "/media/stuff/Music";
  10.    glob_recursive($dir, ".txt");
  11.    ?>
  12.  


-----
if(time()>1356048000) die();
 
 Top
ext
Отправлено: 14 Июня, 2011 - 19:08:35
Post Id


Новичок


Покинул форум
Сообщений всего: 32
Дата рег-ции: Июнь 2011  


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




OrmaJever, именно так, но нужно применить маску.
(Добавление)
всем спасибо, разобрался сам
PHP:
скопировать код в буфер обмена
  1. function glob_recursive($dir){
  2.   foreach(glob($dir."*", GLOB_NOSORT) as $filename){
  3.     if(is_dir($filename)) glob_recursive($filename."/*");
  4.     else{
  5.       foreach(glob($dir."*.txt", GLOB_NOSORT) as $filename){
  6.       echo $filename."<br>";
  7.       }
  8.     }
  9.   }
  10. }
  11. $dir = "/media/stuff/Music";
  12. glob_recursive($dir);

(Отредактировано автором: 14 Июня, 2011 - 19:29:39)

 
 Top
White
Отправлено: 14 Июня, 2011 - 20:11:08
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


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




ext

разобрались, но предложенный мной вариант экономичней к ресурсам системы, так как запрос к фс выполняется один раз, а в вашем случае 2 раза.

При наличии большого количества файлов рискуете не вложиться в таймлимит.


-----
if(time()>1356048000) die();
 
 Top
ext
Отправлено: 14 Июня, 2011 - 20:14:35
Post Id


Новичок


Покинул форум
Сообщений всего: 32
Дата рег-ции: Июнь 2011  


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




White, твой код не работает, может у меня что-то не так настроено? >20000 фалов обработалось за 1.28570103645325 секунды, естественно локально.
(Добавление)
Вопрос теперь в другом, один и тот же файл повторяется несколько раз.

(Отредактировано автором: 14 Июня, 2011 - 20:39:26)

 
 Top
White
Отправлено: 14 Июня, 2011 - 21:08:57
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


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




PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. function glob_recursive($dir, $mask){
  3.         foreach(glob($dir.'/*') as $filename){
  4.                 if(strtolower(substr($filename, strlen($filename)-strlen($mask), strlen($mask)))==strtolower($mask)) echo $filename."<br>";
  5.                 if(is_dir($filename)) glob_recursive($filename, $mask);
  6.         }
  7. }
  8. glob_recursive("/media/stuff/Music", ".txt");
  9. ?>


так точно заработает (проверено).

Цитата:
20000 фалов обработалось за 1.28570103645325 секунды, естественно локально.


Из личного опыта. Получение содержимого каталога джумлы(около 1000 подкаталогов и 5000 файлов) таким способом под Linux: 5 - 10сек. Win7 + Denwer около 20сек + до 100% нагрузки на ЦП. (Core2 1.8, 2Gb). Увеличим это время вдвое, получим довольно неприятную картину.

Но дело ваше.

(Отредактировано автором: 14 Июня, 2011 - 21:09:39)



-----
if(time()>1356048000) die();
 
 Top
ext
Отправлено: 14 Июня, 2011 - 22:17:27
Post Id


Новичок


Покинул форум
Сообщений всего: 32
Дата рег-ции: Июнь 2011  


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




White, спасибо тебе большое Радость Теперь работает все как надо Улыбка
Поставил бы плюсик, сообщений маловатоУлыбка

(Отредактировано автором: 14 Июня, 2011 - 22:19:11)

 
 Top
White
Отправлено: 14 Июня, 2011 - 22:26:45
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


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




незачто


-----
if(time()>1356048000) die();
 
 Top
Borodatych
Отправлено: 14 Июля, 2012 - 08:58:47
Post Id


Новичок


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


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




White
На основе вашего последнего кода написал:
CODE (php):
скопировать код в буфер обмена
  1. function glob_recursive($folder,$mask){
  2.     $j = 0;
  3.     foreach(glob($folder.'/*',GLOB_NOSORT) as $filename){
  4.         $fileindir = strtoupper(substr($filename,strlen($filename) - 4,strlen($filename)));
  5.         if (in_array($fileindir, $mask)) {
  6.             $imagesarray[$j] = $filename;
  7.             //echo $imagesarray[$j].'<br />';
  8.             $j++;
  9.         } elseif (is_dir($filename)) {
  10.             //echo 'FolderName: '.$filename.'<br />';
  11.             glob_recursive($filename, $mask);
  12.         } else {
  13.             //echo 'OtherFiles: '.$filename.'<br />';
  14.         }
  15.     }
  16.     //echo $imagesarray[rand(1,count($imagesarray))-1]."<br>";
  17.     echo $imagesarray[0]."<br>";
  18. }
  19. $folder = 'wp-content';
  20. $mask = array(".GIF","JPEG", ".PNG", ".JPG");
  21. glob_recursive($folder, $mask);

Но не могу довести до ума. Буду признателен, если укажите на ошибки.
На страницу получаю следующий выхлоп:
CODE (htmlphp):
скопировать код в буфер обмена
  1. wp-content/plugins/akismet/akismet.gif
  2. wp-content/plugins/random-image-selector/img_titlebar.png
  3.  
  4.  
  5. wp-content/themes/twentyeleven/images/headers/1/1/chessboard.jpg
  6.  
  7. wp-content/themes/twentyeleven/images/headers/1/2/2/chessboard-thumbnail.jpg
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15. wp-content/themes/twentyeleven/images/headers/chessboard-thumbnail.jpg
  16. wp-content/themes/twentyeleven/images/comment-arrow-bypostauthor-dark-rtl.png
  17. wp-content/themes/twentyeleven/inc/images/content-sidebar.png
  18.  
  19. wp-content/themes/twentyeleven/js/nivoslider/demo/images/dev7logo.png
  20.  
  21.  
  22. wp-content/themes/twentyeleven/js/nivoslider/themes/default/arrows.png
  23.  
  24.  
  25.  
  26.  
  27. wp-content/themes/twentyeleven/screenshot.png
  28. wp-content/themes/twentyten/images/headers/berries-thumbnail.jpg
  29. wp-content/themes/twentyten/images/wordpress.png
  30.  
  31. wp-content/themes/twentyten/screenshot.png
  32.  
  33. wp-content/uploads/2012/07/cropped-июль-150x150.png

Именно с пустыми строками.

1. От куда берутся пустые строки?
Можно ли обыграть так, заменив:
CODE (htmlphp):
скопировать код в буфер обмена
  1. echo $imagesarray[0]."<br>";

На:
CODE (htmlphp):
скопировать код в буфер обмена
  1. if (count($imagesarray) != 0) echo $imagesarray[0]."<br>";

т.е. добавив условия if (count($imagesarray) != 0) и правильно ли это будет?

2. Почему выводится не один а несколько элементов и как вывести всего один?

Рассчитываю на вашу помощь. С уважением, Роман.

(Отредактировано автором: 14 Июля, 2012 - 08:59:55)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с файловой системой и файлами »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB