#php
#php #массивы #файл #сортировка #глоб
Вопрос:
Как мне перечислить первые 5 файлов или каталогов в каталоге, отсортированных в алфавитном порядке с помощью PHP?
Комментарии:
1. Вам нужно, чтобы они были первыми 5 при сортировке по <имя / размер / дата> или просто любыми 5 файлами?
2. Никто, кто создает хороший
glob
ответ, используя шаблон для фильтрации каталогов?
Ответ №1:
Используя scandir()
:
array_slice(array_filter(scandir('/path/to/dir/'), 'is_file'), 0, 5);
array_filter()
Вместе с is_file()
обратным вызовом функции гарантирует, что мы просто обрабатываем файлы без необходимости написания цикла, нам даже не нужно заботиться о .
и ..
поскольку они являются каталогами.
Или с помощью glob()
— он не будет соответствовать именам файлов, таким как .htaccess
:
array_slice(glob('/path/to/dir/*.*'), 0, 5);
Или с помощью glob()
array_filter()
— это будет соответствовать именам файлов, таким как .htaccess
:
array_slice(array_filter(glob('/path/to/dir/*'), 'is_file'), 0, 5);
Комментарии:
1. Отлично, есть ли способ отсортировать файлы по дате?
2. Это полезная старая тема. Но при применении array_filter он не будет работать в php 7.0
Ответ №2:
Это, вероятно, самый простой в использовании scandir
, если вы не хотите сделать что-то более сложное. scandir
также возвращает каталоги, поэтому мы будем фильтровать только разрешенные файлы:
$items = scandir('/path/to/dir');
$files = array();
for($i = 0, $i < 5 amp;amp; $i < count($items); $i ) {
$fn = '/path/to/dir/' . $items[$i];
if(is_file($fn)) {
$files[] = $fn;
}
}
Комментарии:
1.
$i < 5
следует заменить наcount($files) < 5
2. Должно ли это быть?
$i < 5
иcount($files) < 5
практически такие же, хотя$i < 5
и будут немного быстрее, поскольку не вызывают функцию3. $ i также равно 5, когда найдено 5 каталогов… И OP хочет файлы
4. Нет необходимости зацикливаться там… Проверьте мой ответ.
5. @Alix в вашем ответе, что произойдет, если существует каталог (отличный от
.
and..
)?
Ответ №3:
Если вы думаете о низком уровне (упорядоченном по номеру индекса), то функция readdir для вас.
В противном случае, если вы хотите, чтобы они располагались в алфавитном порядке, scandir может быть лучшим вариантом. Как в:
$firstfive = array_slice(scandir("."), 2, 5);
Обратите внимание, что первые две записи, возвращаемые scandir
«.» и «..».
Комментарии:
1. Мне нравится scandir. Но разве это не сканирует все файлы в каталоге?