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 » » Работа с файловой системой и файлами » Работа с подкаталогами

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

1. Okula - 15 Февраля, 2012 - 14:32:22 - перейти к сообщению
А у меня ещё меньше кода Улыбка
PHP:
скопировать код в буфер обмена
  1. /**
  2.  * Рекурсивное сканирование
  3.  *
  4.  * @param string $path_dir путь до сканируемой папки
  5.  * @return array массив с абсолютным путём
  6.  */
  7. function getArrayFiles($path_dir) {
  8.     $array_path = array();
  9.     $dir = new RecursiveDirectoryIterator($path_dir);
  10.     foreach(new RecursiveIteratorIterator($dir) as $val) {
  11.         if($val->isFile()) {
  12.             $array_path[] = $val->getPathname();
  13.         }
  14.     }
  15.     return $array_path;
  16. }

(Добавление)
EuGen, твоя функция с array_marge() будет долго работать.
2. EuGen - 15 Февраля, 2012 - 14:50:34 - перейти к сообщению
Okula
Можно еще "короче"
PHP:
скопировать код в буфер обмена
  1. $sPath     = "/path/to/dir";
  2. $rgResult = array_map("basename", explode(PHP_EOL, shell_exec('find '.$sPath.' -type "f"')));

- речь про то, стоит ли правильность приносить в жертву краткости.

Еще раз про array_merge - там 100000+ файлов, чтобы почувствовать разницу?
3. Okula - 15 Февраля, 2012 - 14:58:39 - перейти к сообщению
На простых хостингах такой вариант не сработает, да и кто му же - зачем писать велосипед, если это можно написать с помощью итераторов. К тому же куда удобнее Улыбка
Кстати, проверил твою функцию она у меня не сработала.

Тест по моей функции:
PHP:
скопировать код в буфер обмена
  1. Количество просканируемых файлов: 3253
  2. Количество вложенных папок: 339
  3. Среднее время выполнение скрипта: 0.08139 сек.
4. EuGen - 15 Февраля, 2012 - 15:11:06 - перейти к сообщению
Okula
Оно и понятно, что итератор в данном случае сработает куда быстрее, я иллюстрировал
EuGen пишет:
стоит ли правильность приносить в жертву краткости

Ну и код для *nix сделан, разумеется.
5. Мелкий - 15 Февраля, 2012 - 15:25:10 - перейти к сообщению
В равных условиях - результат 0.32с и 0.37с для итератора и явной рекурсии соответственно.
Вызов шелла справился за 0.17с.
Директория на 15034 файла (сырцы PHP-5.3.9)

Ведь про кэш ФС не забыли при тесте?

PS: первая функция, GetFilesArr которая, - виндовая. '\\' надо на DIRECTORY_SEPARATOR поменять и будет кроссплатформенная.
6. EuGen - 15 Февраля, 2012 - 15:32:27 - перейти к сообщению
У меня собственно результат другой. Шелл быстрее всех в два раза как и у Вас, но рекурсия сильно сдала.

Выделил в отдельную тему
7. Okula - 15 Февраля, 2012 - 15:55:59 - перейти к сообщению
Зачем удалили мои посты? У меня был рабочий вариант функции с кодом куда лучше.
Пишу ешё раз.
PHP:
скопировать код в буфер обмена
  1. /**
  2.  * Рекурсивное сканирование
  3.  *
  4.  * @param string $path_dir путь до сканируемой папки
  5.  * @return array массив с абсолютным путём
  6.  */
  7. function getArrayFiles($path_dir) {
  8.     $array_path = array();
  9.     $dir = new RecursiveDirectoryIterator($path_dir);
  10.     foreach(new RecursiveIteratorIterator($dir) as $val) {
  11.         if($val->isFile()) {
  12.             $array_path[] = $val->getPathname();
  13.         }
  14.     }
  15.     return $array_path;
  16. }
8. illy - 15 Февраля, 2012 - 17:58:52 - перейти к сообщению
Okula, спасибо.
Добавил скрипт в коллекцию. Хорошо
9. Мелкий - 15 Февраля, 2012 - 18:15:07 - перейти к сообщению
Okula, никуда не удаляли. Первое сообщение этой темы.

 

Powered by ExBB FM 1.0 RC1