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]   

> Описание: Самонаписанная функция для чтения каталогов и удобной записи путей файлов в массив для последующей работы с ними
Пшеница
Отправлено: 09 Августа, 2013 - 01:26:39
Post Id



Новичок


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


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




Здравствуйте!

Сама функция работает нормально с одним но!
В начальном каталоге указанном в параметре $pathDir она корректно сортирует пути и записывает в массив только те файлы расширения которых указанны в параметре $extSearch, а вот в подкаталогах полностью параметр $extSearch игнорируется и в массив заносятся все найденные файлы в этих подкаталогах.

Помогите пожалуйста подкорректировать функцию, что бы она не игнорировала параметр $extSearch при чтении подкаталогов и не записывала в массив файлы чьи расширения не указаны в параметре $extSearch.

Заранее спасибо.

Денвер
PHP 5.4.16
Windows7

PHP:
скопировать код в буфер обмена
  1.  
  2. /**
  3.  * Пример использования:
  4.  * $array = readdir_files('./', array('_txt', '.log', '.pag', '.pid'), 300);
  5.  *
  6.  * @param   string   $pathDir    - относительный или абсолютный путь к папке
  7.  * @param   array    $extSearch  - Расширения файлов для поиска
  8.  * @param   integer  $timeLimit  - ограничение выполнения скрипта (в секундах)
  9.  * @return  array
  10.  */
  11. function readdir_files($pathDir = NULL, $extSearch = NULL, $timeLimit = 120)
  12. {
  13.   // return по умолчанию
  14.   $outputArray = array();
  15.  
  16.   // regexp Расширения файлов для поиска, по умолчанию
  17.   $extDefault = '\.?[\w\d]+';
  18.  
  19.   // Ключ с массивом имён папок где смотреть не нужно
  20.   $continueDir = array('continue' => array('.', '..'));
  21.  
  22.   // Фамилия этой функции
  23.   $self = __FUNCTION__;
  24.  
  25.   // Можно ли заглянуть в папку (разрешено ли чтение папки $pathDir)
  26.   // Если нет вернётся пустой массив
  27.   if ((($pathDir = realpath($pathDir)) !== FALSE) AND (is_readable($pathDir) !== FALSE))
  28.   {
  29.      if (function_exists('set_time_limit')) {
  30.         set_time_limit( (int) $timeLimit);
  31.      }
  32.      
  33.      // Если пользователь указал свои папки где искать не нужно то сливаем с теми, что по умолчанию (вдруг забыл добавить)
  34.      $continueDir = ( ! empty($extSearch['continue'])) ? array_merge($continueDir, (array) $extSearch)['continue'] : $continueDir['continue'];
  35.  
  36.      // Вложенный массив больше не нужен в значении этой переменной (удаляем)
  37.      unset($extSearch['continue']);
  38.      
  39.      // Делает строку из массива для использования в preg_match(regexp)
  40.      $extSearch = ( ! empty($extSearch)) ? str_replace(array('\\', '.'), array(NULL, '\.'), implode('|', (array) $extSearch)) : $extDefault;
  41.  
  42.      // Читаем папку и запускаем цикл
  43.      foreach(array_diff(scandir($pathDir), $continueDir) AS $fileName)
  44.      {
  45.        // Если папка
  46.        if (is_dir($pathDir .DIRECTORY_SEPARATOR .$fileName))
  47.        {
  48.           // Читаем (перезапуском функции) - имя ключа из названия папки
  49.           $outputArray[$fileName] = $self($pathDir .DIRECTORY_SEPARATOR .$fileName);
  50.        }
  51.        
  52.        // Если файл
  53.        elseif (is_file($pathDir .DIRECTORY_SEPARATOR .$fileName))
  54.        {
  55.           // Если расширение файла удовлетворяет, пишем в массив
  56.           if (preg_match('#(' .$extSearch .')$#six', $fileName, $ext))
  57.           {
  58.              // Формирует имя ключа
  59.              $keyName = str_replace($ext[0], NULL, $fileName);
  60.              
  61.              // Если имя ключа пустое то именем будет название файла
  62.              $outputArray[($keyName == NULL ? $ext[0] : $keyName)] = $pathDir .DIRECTORY_SEPARATOR .$fileName;
  63.           }
  64.           else continue;
  65.        }
  66.  
  67.        else continue;
  68.      }
  69.   }
  70.   // End
  71.   return $outputArray;
  72. }
  73.  

(Отредактировано автором: 09 Августа, 2013 - 01:54:22)

 
 Top
avtor.fox
Отправлено: 09 Августа, 2013 - 02:16:27
Post Id



Постоянный участник


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


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




Пшеница, Вы простите, но чем Вам glob не угодил? Танцующая корова

(Отредактировано автором: 09 Августа, 2013 - 02:17:36)

 
 Top
Пшеница
Отправлено: 09 Августа, 2013 - 03:36:53
Post Id



Новичок


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


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




Помогите плиз!

Я как только не пытался всунуть в функцию функцию glob,
или у меня мозгов не хватило или функция не настолько гибкая.
В foreach вообще не хочется использовать glob, жирновато думаю будет так как порой функции приходится за раз обрабатывает больше 100мб, долго отрабатывает.
Пробывал использовать цикл while, много кода получается.
Да и одним while опять же не обойтись.

Нужно что бы сама функция возвращала массив в такой сортировке ключ значения:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. array() {
  3.   ["subdirname0"]=> array() {
  4.           ["filename0"]=>"\path\subdirname0\filename0.ext0"
  5.           ["filename1"]=>"\path\subdirname0\filename1.txt1"
  6.           ["subdirname1"]=> array() {
  7.                  ["filename0"]=>"\path\subdirname0\subdirname1\filename0.ext0"
  8.                  ["filename1"]=>"\path\subdirname0\subdirname1\filename1.txt1"
  9.           }
  10.   }
  11.   ["filename0"]=>"\path\filename0.ext0"
  12.   ["filename1"]=>"\path\filename1.txt1"
  13. }
  14.  


Скрипт один раз читает каталок с подкаталогами - ключи массива сортирует по именам папок и файлов,
что бы можно было обращаться к массиву таким образом:

PHP:
скопировать код в буфер обмена
  1.  
  2. fopen($myArray['subdirname0']['subdirname1']['filename0'], 'r+');
  3.  
  4. /**
  5.  * или так:
  6.  */
  7.  
  8. foreach($myArray['subdirname0']['subdirname1'] AS $filename => $path)
  9. {
  10.   echo '<a href="file:///' . $path .'">' .$filename .'</a>' .PHP_EOL;
  11. }
  12.  
  13. /**
  14.  * или, что то подобное.
  15.  */
  16.  
  17.  

(Добавление)
Нашел ошибку, поправил:
PHP:
скопировать код в буфер обмена
  1.  
  2. $outputArray[$fileName] = $self($pathDir .DIRECTORY_SEPARATOR .$fileName);
  3.  
  4. /**
  5.  * Заменил на:
  6.  */
  7.  
  8. $outputArray[$fileName] = $self($pathDir .DIRECTORY_SEPARATOR .$fileName, array('continue' => $continueDir), $timeLimit);
  9.  


Не передавались параметры.
Главная проблема всё равно осталась.

(Отредактировано автором: 09 Августа, 2013 - 04:05:12)

 
 Top
DeepVarvar Супермодератор
Отправлено: 09 Августа, 2013 - 04:55:10
Post Id



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


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


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




PHP:
скопировать код в буфер обмена
  1. /**
  2.  * WARNING! origin PHP function glob() maybe returned FALSE value!
  3.  * but i'm always expected array!
  4.  */
  5.  
  6. function mainGlob($pattern, $flags = 0) {
  7.  
  8.   if (!$result = glob($pattern, $flags)) {
  9.     $result = array();
  10.   }
  11.  
  12.   return $result;
  13.  
  14. }
  15.  
  16. function globRecursive($path, $mask = "*") {
  17.  
  18.   $items = mainGlob($path . $mask);
  19.   $dirs = mainGlob($path . "*", GLOB_ONLYDIR | GLOB_NOSORT);
  20.  
  21.   foreach ($dirs as $dir) {
  22.     $items = array_merge($items, globRecursive($dir . "/", $mask));
  23.   }
  24.  
  25.   return $items;
  26.  
  27. }
 
 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