views:

127

answers:

3

How would I list the first 5 files or directories in directory sorted alphabetically with PHP?

A: 

If you're thinking low level (ordered by inode number), then readdir is the function for you.

Otherwise, if you want them alphabetical, then scandir might be a better option. As in:

$firstfive = array_slice(scandir("."), 2, 5);

Note that the first two entries returned by scandir are "." and "..".

amphetamachine
I like scandir. But doesn't that scan all the files in a directory?
usertest
What about directories?
Veger
+1  A: 

It's probably most simple to use scandir, unless you want to do something a bit more complex. scandir returns directories as well, so we'll filter to only allow files:

$items = scandir('/path/to/dir');
$files = array();
for($i = 0, $i < 5 && $i < count($items); $i++) {
    $fn = '/path/to/dir/' . $items[$i];
    if(is_file($fn)) {
        $files[] = $fn;
    }
}
adam
`$i < 5` should be replaced with `count($files) < 5`
Veger
Should it? `$i < 5` and `count($files) < 5` are pretty much the same, although `$i < 5` would be marginally faster as it doesn't call a function
adam
$i is also 5 when 5 directories are found... And the OP wants files
Veger
My mistake, good catch
adam
No need to loop there... Check my answer.
Alix Axel
@Alix in your answer, what happens if there is a directory (other than `.` and `..`)?
adam
@adam: Nothing, the directories are ignored due to the usage of the `array_filter()` function in combination with the `is_file()` function callback.
Alix Axel
...which was added after my last comment
adam
@adam: No, don't make me a liar: http://stackoverflow.com/revisions/8dec8230-025c-4bfa-9132-87c96cfbb5d2/view-source this is my first post, `array_filter()` with `is_file()` is there.
Alix Axel
+10  A: 

Using scandir():

array_slice(array_filter(scandir('/path/to/dir/'), 'is_file'), 0, 5);

The array_filter() together with the is_file() function callback makes sure we just process files without having to write a loop, we don't even have to care about . and .. as they are directories.


Or using glob() - it won't match filenames like .htaccess:

array_slice(glob('/path/to/dir/*.*'), 0, 5);

Or using glob() + array_filter() - this one will match filenames like .htaccess:

array_slice(array_filter(glob('/path/to/dir/*'), 'is_file'), 0, 5);
Alix Axel
+1 because it does not return directories
Gordon
+1 very nice solution!
jspcal
@jpscal: Thanks! =)
Alix Axel