PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

Fileinfo> <Fonctions sur les dossiers
Last updated: Fri, 10 Oct 2008

view this page in

scandir

(PHP 5)

scandir Liste les fichiers et dossiers dans un dossier

Description

array scandir ( string $directory [, int $sorting_order [, resource $context ]] )

Retourne un tableau de fichier et dossier, issus de directory .

Liste de paramètres

directory

Le dossier qui sera scanné.

sorting_order

Par défaut, le tri est en ordre alphabétique. Si le paramètre optionnel sorting_order est utilisé (mis à 1), alors le tri sera en ordre alphabétique inverse.

context

Pour une description du paramètre context , référez-vous à la section flux de données du manuel.

Valeurs de retour

Retourne un tableau des fichiers en cas de succès ou FALSE en cas d'échec. Si directory n'est pas un dossier, alors une valeur booléenne FALSE est retournée et une erreur de niveau E_WARNING est générée.

Exemples

Exemple #1 Un simple exemple avec scandir()

<?php
$dir    
'/tmp';
$files1 scandir($dir);
$files2 scandir($dir1);

print_r($files1);
print_r($files2);
?>

L'exemple ci-dessus va afficher quelque chose de similaire à :

Array
(
    [0] => .
    [1] => ..
    [2] => bar.php
    [3] => foo.txt
    [4] => somedir
)
Array
(
    [0] => somedir
    [1] => foo.txt
    [2] => bar.php
    [3] => ..
    [4] => .
)

Exemple #2 Alternatives à scandir() pour PHP 4

<?php
$dir 
"/tmp";
$dh  opendir($dir);
while (
false !== ($filename readdir($dh))) {
    
$files[] = $filename;
}

sort($files);

print_r($files);

rsort($files);

print_r($files);
?>

L'exemple ci-dessus va afficher quelque chose de similaire à :

Array
(
    [0] => .
    [1] => ..
    [2] => bar.php
    [3] => foo.txt
    [4] => somedir
)
Array
(
    [0] => somedir
    [1] => foo.txt
    [2] => bar.php
    [3] => ..
    [4] => .
)

Notes

Astuce

Vous pouvez utiliser une URL comme nom de fichier avec cette fonction, si le gestionnaire fopen a été activée. Voyez fopen() pour plus de détails sur la façon de spécifier le nom du fichier et Liste des protocoles supportés pour une liste des protocoles URL supportés.



Fileinfo> <Fonctions sur les dossiers
Last updated: Fri, 10 Oct 2008
 
add a note add a note User Contributed Notes
scandir
Jason
05-Oct-2008 02:25
http://www.php.net/manual/en/function.scandir.php#80057

This note was very helpful. I was testing my code on a local directory (meaning on my E:/ drive) and I realized that the last slash kept being replaced by a forward slash. I added this bit of code to the "scanDirectories" function which determines if this is a local drive or a internet drive and changes the filename separators.

Thanks everyone, I just started using PHP last week (Sept 2008).

 $count_fwdslash = substr_count($rootDir,'/');
 $separator = ($count_fwdslash==0 ? '\\' : '/');
 $path = $rootDir.$separator.$content;
webmaster at asylum-et dot com
23-Jul-2008 09:50
<?php
/**
 * outputs all files and directories
 * recursively starting with the given
 * $base path. This function is a combination
 * of some of the other snips on the php.net site.
 * All are good but lacked one thing or another
 * that I needed like .htaccess
 * files get excluded with the one that checks to
 * see if the first character is a . and omits
 * that.
 *
 * @example rscandir(dirname(__FILE__).'/'));
 * @param string $base
 * @param array $omit
 * @param array $data
 * @return array
 */
function rscandir($base='', &$data=array()) {
 
 
$array = array_diff(scandir($base), array('.', '..')); # remove ' and .. from the array */
  
 
foreach($array as $value) : /* loop through the array at the level of the supplied $base */
 
   
if (is_dir($base.$value)) : /* if this is a directory */
     
$data[] = $base.$value.'/'; /* add it to the $data array */
     
$data = rscandir($base.$value.'/', $data); /* then make a recursive call with the
      current $value as the $base supplying the $data array to carry into the recursion */
     
   
elseif (is_file($base.$value)) : /* else if the current $value is a file */
     
$data[] = $base.$value; /* just add the current $value to the $data array */
     
   
endif;
   
  endforeach;
 
  return
$data; // return the $data array
 
}

echo
'<pre>'; var_export(rscandir(dirname(__FILE__).'/')); echo '</pre>';
/*
Output:
array (
  0 => '/path/to/web/.htaccess',
  1 => '/path/to/web/foo/',
  2 => '/path/to/web/foo/file.txt'
)
*/
?>
Oleg Svarog
25-Jun-2008 09:41
Some modifications of Daniel's code:
the task before me had such a requirement - to show the folder structure in array as follows

[0] => array
     {
         [name]=>'smth',
         [path] =>'smth',
         [sub] => array
                      {
                         [0] =>
                         [1] =>
                         ...
                      }
      }
[1] => array
     {
         [name]=>'smth',
         [path] =>'smth',
         [sub] => array
                      {
                         [0] =>
                         [1] =>
                         ...
                      }
      }
...

All the structure will be deposited in $allData array

<?php
/**
         * returns the folder content names
         *
         * @param string $rootDir path to the root folder
         * @param array $allowext allowed extensions
         * @param array $notallownames not allowed names
         * @param array $allData array by reference which collects the root content
         */
       
static function ScanDirectories($rootDir, $allowext, $notallownames, &$allData)
        {
             
$dirContent = scandir($rootDir);
              static
$i=0;
            foreach(
$dirContent as $key => $content)
            {
                if (
$content == '.' || $content == '..') continue;
               
$path = $rootDir . SEPARATOR . $content;
               
$ext = substr($content, strrpos($content, '.') + 1);
                if(
in_array($ext, $allowext) && is_file($path) && is_readable($path) && !in_array($content, $notallownames))
                {
                   
$allData[$i][name] = $content;
                   
$allData[$i][path] = $rootDir;
                   
$allData[$i][sub] = '';
                }
                else if(
is_dir($path) && is_readable($path) && !in_array($content, $notallownames))
                {
                   
$allData[$i][name] = $content;
                   
$allData[$i][path] = $rootDir;
                   
$allData[$i][sub] = array();
                  
                   
self::scanDirectories($path, $allowext, $notallownames, &$allData[$i][sub]);
                }
               
$i++;
            }
        }
?>
Daniel
12-Apr-2008 08:55
recursive callback "scanDirectories" did not work for me. So I changed it to:

function scanDirectories($rootDir, $allowext, &$allData = array()) {
    $dirContent = scandir($rootDir);
    foreach($dirContent as $key => $content) {
        if ($content == '.' || $content == '..') continue;
        $path = $rootDir . DIRECTORY_SEPARATOR . $content;
        $ext = substr($content, strrpos($content, '.') + 1);
        if(in_array($ext, $allowext) && is_file($path) && is_readable($path)) {
            $allData[] = $path;
        }
        else if(is_dir($path) && is_readable($path)) {
            // recursive callback to open new directory
            scanDirectories($path, $allowext, $allData);
        }
        // else unreadable hell
    }
    return $allData;
}
asamir at asamir dot net
05-Mar-2008 01:21
This is a modification of scanDirectories function that generates a list of all files in the chosen directory and all subdirectories of specific extentions $allowext

<?php
function scanDirectories($rootDir, $allowext, $allData=array()) {
   
$dirContent = scandir($rootDir);
    foreach(
$dirContent as $key => $content) {
       
$path = $rootDir.'/'.$content;
       
$ext = substr($content, strrpos($content, '.') + 1);
       
        if(
in_array($ext, $allowext)) {
            if(
is_file($path) && is_readable($path)) {
               
$allData[] = $path;
            }elseif(
is_dir($path) && is_readable($path)) {
               
// recursive callback to open new directory
               
$allData = scanDirectories($path, $allData);
            }
        }
    }
    return
$allData;
}

$rootDir = "www";
$allowext = array("zip","rar","html");
$files_array = scanDirectories($rootDir,$allowext);
print_r($files_array);
?>
SlowWalkere at gmail dot com
16-Feb-2008 01:22
Just noticed a minor difference between scandir and readdir.

When opening a directory and using readdir(), each file appears to be accessed in the process.  This resets the "Last Accessed" time that you would get with fileatime().

With scandir(), the list is created and none of the files are accessed.  Therefore the access times remain unchanged.

I encountered this while writing a script to scan a directory and delete any file that hadn't been accessed in x time.  Kind of defeated the purpose when the directory listing accessed every file...
fatpratmatt dot at dot gmail dot com
27-Dec-2007 01:28
This function generates a list of all files in the chosen directory and all subdirectories, throws them into a NON-multidimentional array and returns them.

Most of the recursive functions on this page only return a multi-dimensional array.

This is actually a modification of some one else's function (thanks mail at bartrail dot de ;])

<?php
function scanDirectories($rootDir, $allData=array()) {
   
// set filenames invisible if you want
   
$invisibleFileNames = array(".", "..", ".htaccess", ".htpasswd");
   
// run through content of root directory
   
$dirContent = scandir($rootDir);
    foreach(
$dirContent as $key => $content) {
       
// filter all files not accessible
       
$path = $rootDir.'/'.$content;
        if(!
in_array($content, $invisibleFileNames)) {
           
// if content is file & readable, add to array
           
if(is_file($path) && is_readable($path)) {
               
// save file name with path
               
$allData[] = $path;
           
// if content is a directory and readable, add path and name
           
}elseif(is_dir($path) && is_readable($path)) {
               
// recursive callback to open new directory
               
$allData = scanDirectories($path, $allData);
            }
        }
    }
    return
$allData;
}
?>

Example output:

print_r(scanDirectories("www"));
---
Array
(
    [0] => www/index.php
    [1] => www/admin.php
    [3] => www/css/css.css
    [4] => www/articles/2007/article1.txt
    [4] => www/articles/2006/article1.txt
    [8] => www/img/img1.png
)
mail at bartrail dot de
21-Nov-2007 10:39
Here's another little function to scan a directory and it's file contents width scandir() including a little file filter..
<?php
/**
 * Recursive function to scan a directory with * scandir() *
 *
 * @param String $rootDir
 * @return multi dimensional array
 */
function scanDirectories($rootDir) {
   
// set filenames invisible if you want
   
$invisibleFileNames = array(".", "..", ".htaccess", ".htpasswd");
   
// run through content of root directory
   
$dirContent = scandir($rootDir);
   
$allData = array();
   
// file counter gets incremented for a better
   
$fileCounter = 0;
    foreach(
$dirContent as $key => $content) {
       
// filter all files not accessible
       
$path = $rootDir.'/'.$content;
        if(!
in_array($content, $invisibleFileNames)) {
           
// if content is file & readable, add to array
           
if(is_file($path) && is_readable($path)) {
               
$tmpPathArray = explode("/",$path);
               
// saving filename
               
$allData[$fileCounter]['fileName'] = end($tmpPathArray);
               
// saving while path (for better access)
               
$allData[$fileCounter]['filePath'] = $path;
               
// get file extension
               
$filePartsTmp = explode(".", end($tmpPathArray));
               
$allData[$fileCounter]['fileExt'] = end($filePartsTmp);
               
// get file date
               
$allData[$fileCounter]['fileDate'] = filectime($path);
               
// get filesize in byte
               
$allData[$fileCounter]['fileSize'] = filesize($path);
               
$fileCounter++;
           
// if content is a directory and readable, add path and name
           
}elseif(is_dir($path) && is_readable($path)) {
               
$dirNameArray = explode('/',$path);
               
$allData[$path]['dirPath'] = $path;
               
$allData[$path]['dirName'] = end($dirNameArray);
               
// recursive callback to open new directory
               
$allData[$path]['content'] = scanDirectories($path);
            }
        }
    }
    return
$allData;
}
?>
cHH
05-Nov-2007 06:46
Since scandir() returns and array, here is a more concise method of dealing with the '.' and '..' problem when listing directories:

$target = '/';
$weeds = array('.', '..');
$directories = array_diff(scandir($target), $weeds);
   
foreach($directories as $value)
{
   if(is_dir($target.$value))
   {
      echo $value.'<br />';
   }
}
deryckchan at gmail dot com
31-Aug-2007 04:44
Bear in mind that sorting is *always* performed when scandir() is called. String sorting takes O(|s|n log n) runtime, and this adds to the burden of the server's memory and processing power.

Therefore, whenever the alphabetical order of the directory content is unimportant, especially if sorting is to be performed by another order, or the natural order of the files on the filesystem is to be utilized, the use of opendir(), readdir() and closedir() combined is always preferred to scandir().
dsiembab at fullchannel dot net
28-Jun-2007 09:51
Saw banzai monkeys code and tweaked it a little. I don't have scandir. So I had to play with the suggested use for php4.
Pretty new to PHP so beer with me. This will show your current directory as a link called "Back" and will list all of your files in a menu. I wanted this because I have a lot of static pages and needed a menu that would auto update every time I added a file.

<?php
$current
=getcwd();
$directory=basename($current);
$direct=str_replace('-',' ',$directory);
$directoryuppercasewords=ucwords($direct);

/*this first section above will  get your current folder or directory and since I have a "-" between the words of my file I have to strip them to look good if I want to show the current folder or directory in the title of the first link
*/
$dir = '.';
$dh  = opendir($dir);
while (
false !== ($filename = readdir($dh))) {
   
$files[] =$filename;
}
$t=array_slice($files,2);
$f=array_search('index.php',$t);
/*this code above with the variable $t gets rid of the '.' and the '..' parent and ancestor files. And the variable $f finds the index file and with the code below 'unset' let you use $f as the key to get rid of that file.
*/
unset($t[$f]);
  print(
'<ul align="left">');
    print(
'<li><a href="." title="'.$directoryuppercasewords.'">Back</a></br></li>');
  foreach(
$t as $key => $value){
   
$phpkill=str_replace('.php', '', $value);
   
$htmlkill=str_replace('.html', '', $phpkill);
   
$dashkill=str_replace('-',' ',$htmlkill);
   
$uppercasewords=ucwords($dashkill);
   
    print(
'<li><a href="' . $dir . '/' . $value . '" title="'.$uppercasewords.'>' . $uppercasewords . "</a></br></li>");
  }
  print(
'</ul>');
    
closedir($dh);
?>
I basically made all the variables so they could explain themselves, Regular expression is not my strong point right now, just becoming familiar with php functions is more of a priority, I hope this is usefull to someone.
Michael from Yokohama, Japan
08-Jun-2007 10:43
Re: phdwight comments about Japanese.

As far as I can see, readdir simply sucks up the byte stream that the OS generates and shots that at the browser. At any rate, it works fine on the PHP4 server I'm using.

The key is matching the "Content-type" headers and html / xml "encoding" values to what the OS is generating.

This gets more complex if you think of a folder that can be accessed by a samba share. The Japanese files saved from a windows client will be have the file name encoded in ShiftJIS. Any files created locally on the system would be in UTF8 (on a UTF8 system). This results in a jumbled up list of UTF8 and ShiftJIS file names in the same directory. Try displaying that on the one HTML page! It gets messy.

The real issue here is that basically any random stream of bytes is a valid file name on a linux box. Good luck!
Edwin at NOSPAM dot example dot com
29-May-2007 02:46
Aryel wrote a function called php4_scandir which works only if the is_dir function is called with the complete path. Otherwise the function will only work within the current working directory. So changing is_dir($file) to is_dir("$dir/$file") will work.

I believe that the test on skipDots should be negated to get the desired effect.
phdwight at yahoo dot com
20-Mar-2007 06:27
Took a while to figure this:

scandir and readdir functions DOES NOT currently correctly read Japanese files.
When it encounters the Japanese characters, it just displays it as whatever character (mostly ???).
Save your braincells knowing this. Hope PHP 6 will fix this.
aryel at redtwilight dot com dot br
07-Feb-2007 08:07
This function is similar to scandir, but works in PHP4. It uses readdir to get directory info.

<?php
function php4_scandir($dir,$listDirectories=false, $skipDots=true) {
   
$dirArray = array();
    if (
$handle = opendir($dir)) {
        while (
false !== ($file = readdir($handle))) {
            if ((
$file != "." && $file != "..") || $skipDots == true) {
                if(
$listDirectories == false) { if(is_dir($file)) { continue; } }
               
array_push($dirArray,basename($file));
            }
        }
       
closedir($handle);
    }
    return
$dirArray;
}
?>
SkyEye
30-Nov-2006 11:37
dirlst - function to get directory and subdirectory file listing. Function outputs
an array with filenames and optionally also their mod.time and/or size.
You can choose also whether to include subdirectory names into listing
Function returns number of files listed.

$srcdir - source directory (without ending slash)
$fs - output array
$p - position of relative path, usually $p = strlen($srcdir) + 1;
 set to 0 to store absolute path
$getfmt - set to 1 to include filemodtime in output
$getfsz - set to 1 to include filesize in output
$getdrs - set to 1 to include subdirectory names in output
$verbose - set to 1 to display output in runtime

Usage example.

Get directory listing (files only) and save it into a file:
$srcdir = 'C:\SomeFolder';
dirlst($srcdir, $files, strlen($srcdir) + 1, 1, 1, 0, 0);
file_put_contents($filename, join("", $files));

Get listing from file and explode contents:
$files = file($fn);
foreach($files as $line) {
  list($file,$fmt,$fsz)=explode('|',$line);
  ...
}

<?php

function dirlst($srcdir, &$fs, $p=0, $getfmt=0, $getfsz=0, $getdrs=0, $verbose=0) {
 
$num = 0;
  if((
$files = scandir($srcdir))!==false) {   
    foreach(
$files as $file) {
      if(
$file != '.' && $file != '..') {
       
$srcfile = $srcdir . '\\' . $file;    
       
$sf = substr($srcfile,$p);
       
$sst = stat($srcfile);
        if(
$getfmt) { $fmt = $sst['mtime']; $sf.='|'.$fmt; }
        if(
$getfsz) { $fsz = $sst['size']; $sf.='|'.$fsz; }
        if(
is_file($srcfile)) {
         
$fs[] = $sf."|\n";
          if(
$verbose) echo $sf."|\n";                            
        }
        else if(
is_dir($srcfile)) {
          if(
$getdrs) { $fs[] = $sf."|\n"; if($verbose) echo $sf."|\n"; }
         
$num += dirlst($srcfile, $fs, $p, $getfmt, $getfsz, $getdrs, $verbose);
        }
      }
    }
  }
  return
$num;
}

?>

dirsort - function to sort directory listing array. Function returns sorted array.

$fs - sortable array (got by dirlst())
$col - column to sort; if the listing contains filename, filemodtime and filesize,
 then: 0 - files, 1 - mod.time, 2 - size
$dsc - set to 0 to sort ascending, 1 - to sort descending

Usage example.

Sort by size, ascending:
$fs = dirsort($fs, 2, 0);

<?php

function dirsort($fs, $col=0, $dsc=0) {
  foreach(
$fs as $line) list($col0[],$col1[],$col2[]) = explode('|',$line);
  if(
$col==0) {
   
natcasesort($col0); if($dsc) $col0=array_reverse($col0,1);
   
$keys = array_keys($col0);
  }
  if(
$col==1) {
    if(
$dsc) arsort($col1); else asort($col1);
   
$keys = array_keys($col1);
  }
  if(
$col==2) {
    if(
$dsc) arsort($col2); else asort($col2);
   
$keys = array_keys($col2);
  }
  foreach(
$keys as $k) $nfs[] = $fs[$k];
  return
$nfs;
}

?>
beingmrkenny at gmail dot com
13-Aug-2006 08:41
I wrote this function to read a folder and place all the folders and sub folders it contains into an array.

<?php

// Initialise empty array, otherwise an error occurs
$folders = array();

function
recursive_subfolders($folders) {

   
// Set path here
   
$path = '/path/to/folder';
   
   
// Create initial "Folders" array
   
if ($dir = opendir($path)) {
       
$j = 0;
        while ((
$file = readdir($dir)) !== false) {
            if (
$file != '.' && $file != '..' && is_dir($path.$file)) {
               
$j++;
               
$folders[$j] = $path . $file;
            }
        }
    }
   
   
closedir($dir);
   
   
// Then check each folder in that array for subfolders and add the subfolders to the "Folders" array.
   
$j = count($folders);
    foreach (
$folders as $folder) {
        if (
$dir = opendir($folder)) {
            while ((
$file = readdir($dir)) !== false) {
               
$pathto = $folder. '/' . $file;
                if (
$file != '.' && $file != '..' && is_dir($pathto) && !in_array($pathto, $folders)) {
                   
$j++;
                   
$folders[$j] = $pathto;
                   
$folders = recursive_subfolders($folders);
                }
            }
        }
       
closedir($dir);
    }
   
   
sort($folders);
    return
$folders;
}

$folders = recursive_subfolders($folders);

?>

$folders now contains an array with the full paths to each subfolder. E.g.:

Array
(
    [0] => /path/to/folder/dir1
    [1] => /path/to/folder/dir1/subdir
    [2] => /path/to/folder/dir1/subdir/subsubdir
    [3] => /path/to/dolfer/dir2
)

This function has only been tested on Linux.
malmsteenforce at tlen dot pl
19-Jul-2006 09:55
This function is recursive version of scandir, it scans all directories inside given directory. For instance : if we give path './dir1/' as argument , function will find also /dir1/dir2/file etc. - everything what`s inside given directory.

function scandir_recursive($path)
{
if (!is_dir($path)) return 0;
$list=array();
$directory = @opendir("$path"); // @-no error display
while ($file= @readdir($directory))
  {
       if (($file<>".")&&($file<>".."))
        { 
           $f=$path."/".$file;
$f=preg_replace('/(\/){2,}/','/',$f); //replace double slashes
if(is_file($f)) $list[]=$f;            
if(is_dir($f))
$list = array_merge($list ,scandir_recursive($f));   //RECURSIVE CALL                              
        }   
   }
@closedir($directory); 
return $list ;
}
www.mdsjack.bo.it
07-Apr-2006 08:54
I would like to share a couple of functions I've made to get an Array of files of a certain extension inside a Directory.

<?php

// Firstly, a PHP 5 emulation

function php4_scandir($dir, $sort = 0)
{
    if (
PHP_VERSION >= '5') return scandir($dir, $sort);
   
   
$dirmap = array();
   
    if(!
is_dir($dir))
    {
       
trigger_error("lib::scandir($dir): failed to open dir: Invalid argument", E_USER_WARNING);
        return
false;
    }
   
   
$dir = opendir($dir);
   
    while (
false !== ($file = readdir($dir)))
       
$dirmap[] = $file;
   
   
closedir($dir);
   
    (
$sort == 1) ? rsort($dirmap) : sort($dirmap);
   
    return
$dirmap;
}

/*
Then, this one converts directory files into array items.
It also can filter by file extension.
*/

function dir2arr($dir, $ext = null)
{
   
$arr = array();
   
    if(
PHP_VERSION >= '4.3.0')
    {
       
# PHP 4.3.0 code
       
if ($dir = glob("$dir*".(!$ext ? '.*' : '{'.$ext.', '.strtoupper($ext).'}'), GLOB_NOSORT + GLOB_BRACE))
            foreach (
$dir as $file)
               
$arr[] = preg_replace("#(?:.+\/{1})*([^\.]+)\.(.+)#i", '$1', $file);
    }
    else
    {
       
# PHP 4.2.x code
       
$dir = php4_scandir($dir); // See code snippet above
       
if(!$ext) $ext = '\.[a-z]+';
       
$pattern = "#([^\.|\.\.$]+)$ext#i";
        foreach (
$dir as $file)
            if (
preg_match($pattern, $file, $filename))
               
$arr[] = $filename[1];
    }
   
    return (empty(
$arr) ? false : $arr);
}

?>
carlfredrik dot bowin at gmail dot com
05-Jan-2006 03:03
I made a function that scans the directory and all it subfolders. You can also sort them with folders first and files after, in alphabetic order. It works with both PHP 4 and 5.

<?php

function rec_scandir($dir)
{
   
$files = array();
    if (
$handle = opendir($dir) ) {
        while ( (
$file = readdir($handle)) !== false ) {
            if (
$file != ".." && $file != "." ) {
                if (
is_dir($dir . "/" . $file) ) {
                   
$files[$file] = rec_scandir($dir . "/" . $file);
                }else {
                   
$files[] = $file;
                }
            }
        }
       
closedir($handle);
        return
$files;
    }
}

function
cmp($a, $b)
{
    if (
is_string($a) && is_string($b) ) {
        return
strcmp($a, $b) > 0 ? 1 : -1;
    }elseif (
is_int($a) && is_int($b) ) {
        return
$a > $b ? 1 : -1;
    }elseif (
is_int($a) && is_string($b) ) {
        return
1;
    }elseif (
is_string($a) && is_int($b) ) {
        return -
1;
    }else {
        return
0;
    }
}

function
array_ukmultisort(&$arr, $func) {
   
uksort($arr, $func);
    while ( list(
$key, $val) = each($arr) ) {
        if (
is_array($val) ) {
           
array_ukmultisort($arr[$key], $func);
        }
    }
}

$dir = rec_scandir(".");
array_ukmultisort($dir, "cmp");
echo
"<pre>";
print_r($dir);
echo
"</pre>";

?>
Yassin Ezbakhe <yassin88 at gmail dot com>
01-Sep-2005 01:18
/**********************************************
 *
 *   PURPOSE: List files inside the specified path and its
 *   subdirectories
 *
 *   array scandir_recursive (string dir)
 *
 *   This function will return a multidimensional array
 *   that represents main folder's tree structure.
 *   Each folder has its own named array
 *
 **********************************************/

function scandir_recursive($directory)
{
    $folderContents = array();
    $directory = realpath($directory).DIRECTORY_SEPARATOR;

    foreach (scandir($directory) as $folderItem)
    {
        if ($folderItem != "." AND $folderItem != "..")
        {
            if (is_dir($directory.$folderItem.DIRECTORY_SEPARATOR))
            {
                $folderContents[$folderItem] = scandir_recursive( $directory.$folderItem."\\");
            }
            else
            {
                $folderContents[] = $folderItem;
            }
        }
    }

    return $folderContents;
}
trevi55 at gmail dot com
08-Jul-2005 02:38
For non php5-users here you are this function...
It isn't set the wrapper, but I think it's enough :P.

If no pararameter is set, the scandir() function will scan the local file directory.

Set the optional parameter "$sort" to 1 to reverse the alphabetical-sorting.

<?
function scandir($dir = './', $sort = 0)
{
   
    $dir_open = @ opendir($dir);
   
    if (! $dir_open)
        return false;
       
       
    while (($dir_content = readdir($dir_open)) !== false)
            $files[] = $dir_content;
   
    if ($sort == 1)
        rsort($files, SORT_STRING);
    else
        sort($files, SORT_STRING);
   
    return $files;
}
?>
progrium+php at gmail dot com
01-Jul-2005 01:54
I made this to represent a directory tree in an array that uses the file or directory names as keys and full paths as the value for files. Directories are nested arrays.

<?php
function generatePathTree($rootPath) {
   
$pathStack = array($rootPath);
   
$contentsRoot = array();
   
$contents = &$contentsRoot;
    while (
$path = array_pop($pathStack)) {
      
$contents[basename($path)] = array();
      
$contents = &$contents[basename($path)];
       foreach (
scandir($path) as $filename) {
           if (
'.' != substr($filename, 0, 1)) {
              
$newPath = $path.'/'.$filename;
               if (
is_dir($newPath)) {
                  
array_push($pathStack, $newPath);
                  
$contents[basename($newPath)] = array();
               } else {
                  
$contents[basename($filename)] = $newPath;
               }
           }
       }
    }
    return
$contentsRoot[basename($rootPath)];
}
?>

The function will return something like this:

Array
(
    [index.php] => /usr/local/www/index.php
    [js] => Array
        (
            [async.js] => /usr/local/www/js/async.js
            [dom.js] => /usr/local/www/js/dom.js
            [effects.js] => /usr/local/www/js/effects.js
            [prototype.js] => /usr/local/www/js/prototype.js
        )

    [logo.png] => /usr/local/www/logo.png
    [server.php] => /usr/local/www/server.php
    [test.js] => /usr/local/www/test.js
)
Pawel Dlugosz
11-May-2005 08:18
For directory containing files like (for example) -.jpg the results of scandir are a little "weird" ;)

<?php
  
   $dir
= '/somedir';
  
$files = scandir($dir);
  
print_r($files);
?>

Array
(
    [0] => -.jpg
    [1] => .
    [2] => ..
    [3] => foo.txt
    [4] => somedir
)

Beware - sorting is in ASCII order :)
wwwebdesigner at web doott de
12-Apr-2005 09:20
using sort of scandir() that returns the content sorted by Filemodificationtime.

<?php
function scandir_by_mtime($folder) {
 
$dircontent = scandir($folder);
 
$arr = array();
  foreach(
$dircontent as $filename) {
    if (
$filename != '.' && $filename != '..') {
      if (
filemtime($folder.$filename) === false) return false;
     
$dat = date("YmdHis", filemtime($folder.$filename));
     
$arr[$dat] = $filename;
    }
  }
  if (!
ksort($arr)) return false;
  return
$arr;
}
?>

returns false if an error occured
otherwise it returns an array like this.
Array
(
    [20040813231320] => DSC00023.JPG
    [20040813231456] => DSC00024.JPG
    [20040814003728] => MOV00055.MPG
    [20040814003804] => DSC00056.JPG
    [20040814003946] => DSC00057.JPG
    [20040814004030] => DSC00058.JPG
    [20040814014516] => DSC00083.JPG
    [20050401161718] => album.txt
)
brodseba at brodseba dot com
25-Mar-2005 05:53
This function create a HTML view of a directory.  It also look for subdirectory.  I use some icon to differ from folders or files.  It's also possible to get specific icon for specific file type.

Each entrey is clickable so you can use it to populate a form field.

Have fun!

function ls_recursive2($dir)
{
  if (is_dir($dir))
  {
    $files = scandir($dir);
           
    foreach ($files as $file)
    {
      $currentfile = $dir . "/" . $file;
                   
      $last_dir = "";
      // Calculate they identation.
      $count = substr_count($currentfile, '/');
      $minus_count = substr_count($_SERVER['DOCUMENT_ROOT'], '/');
      $count -= ($minus_count + 2);
               
      for($p = 0; $p < $count; $p++)
      {
        $last_dir .= "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
      }
               
      if (is_dir($currentfile))
      {
        if ($file != '.' && $file != '..')
      {
        $last_dir .= "<img src='images/folder.gif' alt='' align='middle' width='16' height='16' border='0'>&nbsp;<a href=\"javascript:go('" . $currentfile . "')\">". substr($currentfile, strrpos($currentfile, '/')) . "</a><br>";
          echo $last_dir;
          ls_recursive2($currentfile);
        }
      }
      else
      {
        $last_dir .= "<img src='images/file.gif' alt='' align='middle' width='16' height='16' border='0'>&nbsp;<a href=\"javascript:go('" . $currentfile . "')\">". substr($currentfile, strrpos($currentfile, '/')) . "</a><br>";
        echo $last_dir;
      }
    }
  }
}
csaba at alum dot mit dot edu
05-Mar-2005 12:19
Scandir on steroids:
For when you want to filter your file list, or only want to list so many levels of subdirectories...

<?php
function dirList($path="", $types=2, $levels=1, $aFilter=array()) {
//  returns an array of the specified files/directories
//  start search in $path (defaults to current working directory)
//  return $types:  2 => files; 1 => directories; 3 => both;
//  $levels: 1 => look in the $path only; 2 => $path and all children;
//          3 => $path, children, grandchildren; 0 => $path and all subdirectories;
//          less than 0 => complement of -$levels, OR everything starting -$levels down
//                e.g. -1 => everthing except $path; -2 => all descendants except $path + children
//  Remaining argument(s) is(are) a filter array(list) of regular expressions which operate on the full path.
//    First character (before the '/' of the regExp) '-' => NOT.
//    First character (after a possible '-') 'd' => apply to directory name
//    The filters may be passed in as an array of strings or as a list of strings
//  Note that output directories are prefixed with a '*' (done in the line above the return)
  
$dS = DIRECTORY_SEPARATOR;
   if (!(
$path = realpath($path?$path:getcwd()))) return array();    // bad path
   // next line rids terminating \ on drives (works since c: == c:\ on PHP).  OK in *nix?
  
if (substr($path,-1)==$dS) $path = substr($path,0,-1);
   if (
is_null($types)) $types = 2;
   if (
is_null($levels)) $levels = 1;
   if (
is_null($aFilter)) $aFilter=array();

  
// last argument may be passed as a list or as an array
  
$aFilter = array_slice(func_get_args(),3);
   if (
$aFilter && gettype($aFilter[0])=="array") $aFilter=$aFilter[0];
  
$adFilter = array();
  
// now move directory filters to separate array:
  
foreach ($aFilter as $i=>$filter)                  // for each directory filter...
    
if (($pos=stripos(" $filter","d")) && $pos<3) {  // next line eliminates the 'd'
        
$adFilter[] = substr($filter,0,$pos-1) . substr($filter,$pos);
         unset(
$aFilter[$i]); }
  
$aFilter = array_merge($aFilter);    // reset indeces

  
$aRes = array();                    // results, $aAcc is an Accumulator
  
$aDir = array($path);    // dirs to check
  
for ($i=$levels>0?$levels++:-1;($aAcc=array())||$i--&&$aDir;$aDir=$aAcc)
     while (
$dir = array_shift($aDir))
         foreach (
scandir ($dir) as $fileOrDir)
           if (
$fileOrDir!="." && $fileOrDir!="..") {
               if (
$dirP = is_dir ($rp="$dir$dS$fileOrDir"))
                 if (
pathFilter("$rp$dS", $adFilter))
                    
$aAcc[] = $rp;
               if (
$i<$levels-1 && ($types & (2-$dirP)))
                 if (
pathFilter($rp, $aFilter))
                    
$aRes[] = ($dirP?"*":"") . $rp; }
   return
$aRes;
}
?>

example usage:
<?php
define
("_", NULL);
// this will find all non .jpg, non .Thumbs.db files under c:\Photo
$aFiles =