Antes que nada, debemos ocuparnos de realizar las funcionalidades m�s b�sicas: queremos obtener algo que pueda escanear carpetas y devolver nombres de archivos. Como no sabemos cu�ntas carpetas deber�n ser procesadas y hasta d�nde tendremos que bajar, aplicaremos un m�todo recursivo. El c�digo en el Listado 1 hace aquello para lo que fue creado: escanear.
$handle = opendir('.'); while ($file = readdir($handle)) { if(is_dir($file) && $file != "." && $file != "..") $sdirs[] = $file; elseif(is_file($file) && $file != basename($PHP_SELF)) $sfiles[] = $file; //aqu� agregamos la l�nea gracias a la cual se ven los primeros resultados //� v�ase Figura 1 print "$file<br>"; }

En la primera l�nea se abre el directorio actual, despu�s de lo que se ejecuta un bucle que lee todos los elementos de este directorio. Tenemos que separar los archivos de los directorios porque estos �ltimos tambi�n deber�n ser escaneados de manera recursiva. Las entradas �.� y �..� as� como el script mismo ser�n excluidos.
A partir de este enfoque implementaremos una funci�n recursiva, la cual se invocar� a s� misma para cada elemento del array $sdirs[] y a la salida devolver� datos que puedan ser despu�s verificados. La �nica cosa que debemos tener en cuenta es el hecho de que $PHP_SELF es una variable global, as� que tiene que ser declarada como tal al inicio de la funci�n. Nuestra funci�n debe recibir como argumento el directorio a escanear. Antes de invocarla podemos asegurarnos de que este directorio sea el actual, o bien pasar su ruta de acceso como argumento a la funci�n opendir(); el cambio del directorio actual se realiza con ayuda de la funci�n chdir() (v�ase Listado 2 o 3).
function list_dir($chdir) { ... chdir($chdir); ... $handle = opendir('.'); ... }
function list_dir($chdir) { ... $handle = opendir($chdir); ... }
Como no hay necesidad de realizar ning�n otro tipo de procesamiento de los archivos y directorios encontrados, el contenido de los arrays $files[] y $sdirs[] no tiene por qu� ser devuelto.
En este momento, el siguiente trozo de c�digo es responsable de la visualizaci�n de los datos que nos interesan:
for($i=0; $i<sizeof($sdirs); $i++) echo "$sdirs[$i]<br>"; for($i=0; $i<sizeof($sfiles); $i++) echo "$sfiles[$i]<br>";
�Y si es necesario hacer algo m�s con los archivos, por ejemplo clasificarlos seg�n su tama�o? Basta con devolver los arrays con archivos y directorios y no visualizar el resultado inmediatamente. Sin embargo, el almacenamiento de estos datos requiere de no poca habilidad: ser�a necesaria una estructura mucho m�s compleja que un simple array. Podemos, por ejemplo, hacer uso de un array tridimensional donde las claves sean los nombres de los directorios, y los valores de los arrays con el contenido de esos directorios. Probablemente esto afectar� negativamente la velocidad de funcionamiento del script, adem�s de consumir una cantidad mayor de memoria. Personalmente no utilizar�a este tipo de programa para generar el mapa de un sitio, no solamente por las razones (econ�micas) mencionadas m�s arriba, sino tambi�n porque el procesamiento de los datos recogidos ser� bastante dif�cil.
Avanzando en la exploraci�n recursiva del �rbol de directorios, llegar� un momento en que tendremos que determinar el lugar preciso en que nuestra funci�n se llamar� a s� misma. Puesto que los directorios deben aparecer antes que los ficheros, haremos esta llamada tal y como podemos ver en el Listado 4.
$dir = getcwd(); for($i=0; $i<sizeof($sdirs); $i++) { echo "$sdirs[$i]<br>"; list_dir($dir."/".$sdirs[$i]); }
Cada vez que terminemos de escanear un directorio, cambiaremos el directorio actual al siguiente que deseamos procesar. A�adiremos, pues:
chdir($chdir);
Recordemos que $chdir es la variable que la funci�n list_dir() recibi� como argumento.
Cuando hayamos hecho todo esto, bastar� con invocar la funci�n con el nombre de un directorio como argumento, para que todos sus subdirectorios sean tambi�n escaneados (para obtener el nombre del directorio actual haremos uso de getcwd() (ver Listado 5))
function list_dir($chdir) { [implementaci�n de la funci�n] } $cwd = getcwd(); list_dir($cwd);