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. surrealistic pillow - 19 Января, 2015 - 10:23:14 - перейти к сообщению
Функция должна открывать все файлы в заданной директории, читать их содержимое в строку и проверять наличие в этой строке подстроки, если подстрока содержится, то заносить путь к файлу в массив $arFiles. В случае если заданная директория содержит вложенные директории, функция должна рекурсивно открывать и проверять все файлы во вложенных директориях.
Искомая подстрока передается из формы.

Вот код. Он не работает, т.к. скрипт не успевает выполниться.

CODE (html):
скопировать код в буфер обмена
  1.  
  2. <pre>
  3. <form method='post' action=''>
  4. <table>
  5. <tr><td>searchtext</td><td>replace</td></tr>
  6. <tr><td><input type='textarea' name='needle'></td><td><input type='checkbox' name='replace'></td>
  7. <tr><td colspan = '2'>replacetext</td></tr>
  8. <tr><td colspan = '2'><input type='textarea' name = 'replacetext'></td></tr>
  9. <tr><td colspan='2'><input type='submit'></td></tr>
  10. </form>
  11.  

PHP:
скопировать код в буфер обмена
  1.  
  2. function searchInFiles($scandir, $needle){
  3.         global $arFiles;
  4.         if(!$scandir = realpath($scandir)){
  5.         return false;
  6.     }  
  7.  
  8.         $arFiles = array();    
  9.  
  10.         foreach(scandir($scandir) as $file){
  11.                
  12.                 if($file=='.' OR $file=='..'){
  13.                         continue;
  14.                 }
  15.                 $file = $scandir.'\\'.$file;
  16.                
  17.                 if(is_file($file)){                            
  18.                         $str = file_get_contents($file);
  19.                         if(strpos($str,$needle)!==false){
  20.                                 $arFiles[] = $file;
  21.                         }
  22.                 }
  23.                 else{                  
  24.                         $arFiles = array_merge($arFiles, searchInFiles($file, $needle));                               
  25.                 }
  26.         }              
  27.  
  28.         if(is_array($arFiles))
  29.                 return $arFiles;
  30.         else
  31.                 return false;
  32. }
  33.  
  34. $arr = searchInFiles($scandir, $needle);
  35. print_r($arr);
  36.  

Где же тут собака зарыта?
2. RickMan - 19 Января, 2015 - 10:32:48 - перейти к сообщению
Если скрипт не успевает выполниться то используйет это :
http://www.php.su/set_time_limit
http://php.net/manual/ru/functio...t-time-limit.php
3. DelphinPRO - 19 Января, 2015 - 10:33:08 - перейти к сообщению
scandir помимо элементов каталога возвращает еще два каталога '.' и '..' (текущий и уровнем выше)
ВЫ не проверяете элемент "на точку", а при проверке пути
PHP:
скопировать код в буфер обмена
  1. is_dir('\\openserver\\domains\\localhost\\books\\admin\\.') // (с точкой на конце)

будет истина, и функция будет вызвана для того же каталога. И процесс этот, как вы понимаете, никогда не завершится.
4. surrealistic pillow - 19 Января, 2015 - 11:41:11 - перейти к сообщению
DelphinPROДобавил проверку на '.' и '..'.
Ошибка исчезла, однако во вложенных директориях подстроку не ищет, только в заданной директории, то есть рекурсия не работает Растерялся
5. LIME - 19 Января, 2015 - 11:44:27 - перейти к сообщению
$file = $scandir.$file;
че за фигня?
выброси
6. surrealistic pillow - 19 Января, 2015 - 11:55:17 - перейти к сообщению
LIMEscandir возвращает массив имен файлов и вложенных директорий, а не путь к файлу\директории, который нужен как аргумент для is_file, file_get_contents и остальных
7. armancho7777777 - 19 Января, 2015 - 12:04:58 - перейти к сообщению
RecursiveDirectoryIterator
8. Мелкий - 19 Января, 2015 - 12:05:23 - перейти к сообщению
http://php.net/manual/en/class.r...toryiterator.php
9. surrealistic pillow - 19 Января, 2015 - 12:09:47 - перейти к сообщению
armancho7777777, Мелкий то есть реализовать желаемое возможно только с помощью ООП?
10. LIME - 19 Января, 2015 - 12:14:03 - перейти к сообщению
surrealistic pillow так выведи и убедись что там путь
слеш там есть?
сомневаюсь
11. Мелкий - 19 Января, 2015 - 12:19:37 - перейти к сообщению
surrealistic pillow пишет:
то есть реализовать желаемое возможно только с помощью ООП?

То есть раз есть штатный итератор - зачем писать свой и ходить по граблям?
12. surrealistic pillow - 19 Января, 2015 - 12:29:58 - перейти к сообщению
Мелкий, я не ищу легких путей Радость
На самом деле я еще только учусь и просто хочу понять, почему мой код не работает.
13. LIME - 19 Января, 2015 - 12:33:32 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. echo '<br>' . $file = $scandir.$file;
Нунчаки
14. armancho7777777 - 19 Января, 2015 - 12:38:28 - перейти к сообщению
Ну тогда уж сахарок добавить в виде фильтра )
PHP:
скопировать код в буфер обмена
  1. function scandirRecursive($path, $filter = null)
  2. {
  3.     if(!$path = realpath($path) OR !is_dir($path)) {
  4.         return false;
  5.     }
  6.  
  7.     $result = array();
  8.     $isCallable = is_callable($filter);
  9.  
  10.     foreach(scandir($path) as $item)
  11.     {
  12.         if($item == '.' || $item == '..') {
  13.             continue;
  14.         }
  15.  
  16.         $item = $path . DIRECTORY_SEPARATOR . $item;
  17.  
  18.         if(is_dir($item)) {
  19.             $result = array_merge($result, scandirRecursive($item, $filter));
  20.         } else if(!$isCallable OR call_user_func($filter, $item)) {
  21.             $result[] = $item;
  22.         }
  23.     }
  24.  
  25.     return $result;
  26. }


Пример:
PHP:
скопировать код в буфер обмена
  1. $result = scandirRecursive(__DIR__, function($file){
  2.     return strtolower(pathinfo($file, PATHINFO_EXTENSION)) == 'php';
  3. });
  4.  
  5. print_r($result);
15. LIME - 19 Января, 2015 - 12:53:05 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. if($path != realpath($path) OR !is_dir($path)) {
  2.         return false;
  3.     }
  4. $path = rtrim($path, DIRECTORY_SEPARATOR);
Насвистываю
(Добавление)
armancho7777777 пишет:
!$path = realpath($path)
багу убери сначала)))

 

Powered by ExBB FM 1.0 RC1