Доброго времени суток! Мне необходимо узнать, есть ли в папке другие папки с нужным файлом (entry.yaml) и при этом не проходя по всем вложенным папкам. В принципе я думаю мне будет достаточно первого такого попадания для определения есть ли в нужной папки вложенные папки + файл (entry.yaml) чтобы получить флаг для дальнейшего его использования Пример структуры папок: Код (Text): /page1/ -- entry.yaml /page2/ -- entry.yaml -- /page1/ ---- entry.yaml ... -- /page1000/ ---- entry.yaml Сейчас я получаю список вложенных папок и проверяю, есть ли в них файлы (entry.yaml) и тогда ставлю флаг для родительской папки, о том что у нее есть вложенные папки. Как сделать тоже самое, но без перебора всех папок (так как их может быть тысячи) ?
Средствами пыха - никак. Можно в shell сделать поиск файла и получить ответ в пыхе, это будет гораздо быстрее. Но, опять же, пользователю, от которого выполняется веб-сервер (мы же сейчас про веб говорим, да?), нужен будет доступ к shell. --- Добавлено --- Дополнение: хотя, мб соглашусь с предыдущим оратором, glob, возможно, тоже будет быстрее перебора. Там хоть и идёт такой же перебор, но всё-таки не силами пыха. Проверять лень.
то есть как либо циклом нельзя организовать заход в нужную папку и остановить проход по папкам при первой найденом совпадении ? хотя мне что-то кажется что это нереально узнать какая из папок из тысячи содержит и нужный файл в себе без перебора всего, хммммммм
Проблема со скоростью уже возникла или ты решаешь проблему, которой нет?) Я бы попробовал тупой рекурсией обходить, а когда вопрос встанет тогда уже думать. Кэшировать результат можно. Помойму обойти пару тройку тыщ файлов - это тьфу и растереть. А на ссд так и подавно. --- Добавлено --- Если эти файлы не открывать конечно
> Проблема со скоростью уже возникла или ты решаешь проблему, которой нет?) нет, я просто задумался, на будущее)
Чем тебя рекурсивная функция не устраивает? Нашел что искал и сразу ушел из рекурсии вернув тру. В теле цыкл который запускает себя до тех пор пока не найдет нужный файл или дойдет до максимальной глубины вложенности.
Без потери производительность прошу прощения забыл уже.. но дело в том что папки в отличии от файлов не имеют расширения (нет точки в названии). что является отличной причиной попытаться заглянуть внутрь. (а дальше дело техники.) Папки с точкой конечно создать можно.. а зачем.
я не ошибся и сделал приписку произвоительность is dir - да все хорошо но будет чуть помедленнее чем вот такая реализация Код (Text): // Пример #1 Простой пример использования функции scandir() <?php $dir = '/tmp'; $files1 = scandir($dir); $files2 = scandir($dir, 1); print_r($files1); print_r($files2); ?> // Результатом выполнения данного примера будет что-то подобное: Array ( [0] => . [1] => .. [2] => bar.php [3] => foo.txt [4] => somedir ) Array ( [0] => somedir [1] => foo.txt [2] => bar.php [3] => .. [4] => . ) как видите имя somedir светится на фоне всего остального И поставив обработку элементов массива (проверку на точку.. [любые символы] . [любые символы] - подумал дописал - или даже просто проверка на отсутствие точки..) мы видим с чем имеем дело - заглядывать или нет - а это и есть сильная экономия ресурсов в отлчии от is_dir() которая заглядывает во всюда, чтобы дать ответ. работа с физикой гораздо дольше чем проверочные действия в оперативке - речь о долях секунд но тем не менее - море оно из капель (r))
@acho, ну..... оптимальное универсальным не бывает - взаимоисключающие понятия. а так то оно вот: Код (Text): <?php foreach(new DirectoryIterator('./dir') as $file) { echo $file ->getPathname() . '<br />'; } ?> //весь код https://www.php.net/manual/ru/class.directoryiterator.php но зачем тема когда в Гугле 10000 ответов и примеров..
При добавлении файла, ты можешь брать его абсолютный путь и класть в файл в корне (как вариант), далее ты достаешь один файл из корня и идешь построчно, получая каждый файл поклав болт на папки ))