Joel
Joel

Reputation: 2721

Is there an easy way to read filenames in a directory and add to an array?

I have a directory: Audio/ and in that will be mp3 files only. I'm wanting to automate the process of creating links to those files. Is there a way to read a directory and add filenames within that directory to an array?

It'd be doubly cool if we could do an associative array, and have the key be the file name minus the .mp3 tag.

Any ideas?

To elaborate: I actual have several Audio/ folders and each folder contains mp3s of a different event. The event details are being pulled from a database and populating a table. That's why I'm duplicating code, because right now in each Audio/ folder, I'm having to define the filenames for the download links and define the filenames for the mp3 player.

Thank you! This will greatly simplify my code as right now I'm repeating tons of code over and over!

Upvotes: 3

Views: 3961

Answers (6)

wimvds
wimvds

Reputation: 12850

And for completeness : you could use glob as well :

$files = array_filter(glob('/path/to/files/*'), 'is_file'); 

This will return all files (but not the folders), you can adapt it as needed.

To get just the filenames (instead of files with complete path), just add :

$files = array_map('basename', $files);

Upvotes: 3

Raz
Raz

Reputation: 682

$results = array();
$handler = opendir($directory);
while ($file = readdir($handler)) {
  if ($file != "." && $file != "..") {
    $results[] = $file;
  }
}
closedir($handler);

this should work, if you want any files to be excluded from the array, just add them to the if statement, same for file extensions

Upvotes: 1

Brenton Alker
Brenton Alker

Reputation: 9072

The SPL way is with DirectoryIterator:

$files = array();
foreach (new DirectoryIterator('/path/to/files/') as $fileInfo) {
    if($fileInfo->isDot() || !$fileInfo->isFile()) continue;
    $files[] = $fileInfo->getFilename();
}

Upvotes: 3

Rafael
Rafael

Reputation: 393

Sure...I think this should work...

$files[] = array();
$dir = opendir("/path/to/Audio") or die("Unable to open folder");
    while ($file = readdir($dir)) {
        $cleanfile = basename($file);
        $files[$cleanfile] = $file;
    }
    closedir($dir);

I imagine that should work...

Upvotes: 1

awgy
awgy

Reputation: 16914

This should be able to do what you're looking for:

// Read files
$files = scandir($dirName);
// Filter out non-files ('.' or '..')
$files = array_filter($files, 'is_file');
// Create associative array ('filename' => 'filename.mp3')
$files = array_combine(array_map('basename', $files), $files);

Upvotes: 1

user113292
user113292

Reputation:

Yes: use scandir(). If you just want the name of the file without the extension, use basename() on each element in the array you received from scandir().

Upvotes: 1

Related Questions