2011-06-27 24 views
14

Me gustaría usar opendir() para listar solo las carpetas en una carpeta particular (es decir,/www/sitio /). Me gustaría excluir los archivos de la lista también en el '.' y '..' carpetas que aparecen en una lista de carpetas de Linux. ¿Cómo voy a hacer esto?PHP opendir() para enumerar carpetas solo

Respuesta

18

Echa un vistazo a PHP docs for readdir(). Incluye un ejemplo para esto exactamente.

Para completar:

<?php 
if ($handle = opendir('.')) { 
    $blacklist = array('.', '..', 'somedir', 'somefile.php'); 
    while (false !== ($file = readdir($handle))) { 
     if (!in_array($file, $blacklist)) { 
      echo "$file\n"; 
     } 
    } 
    closedir($handle); 
} 
?> 

Simplemente cambie opendir('.') a su directorio, es decir opendir('/www/sites/'), y actualizar $blacklist para incluir los nombres de los archivos o directorios que no desea salida.

+2

Esto sólo filtros '' .' y ..', no otros directorios. – phihag

+0

@phihag, buen punto. Ver actualización –

+0

Gracias, funcionó ... Estuve mirando al hombre por opendir. No vi la página para leer. –

8
function scandir_nofolders($d) { 
    return array_filter(scandir($d), function ($f) use($d) { 
     return ! is_dir($d . DIRECTORY_SEPARATOR . $f); 
    }); 
} 

Esta función devuelve una matriz que puede iterar sobre o almacenar en algún lugar, que es lo que el 99,37% de todos los programadores usando opendir falta.

+0

Los filtros están fallando porque, en la función anónima, $ dir no está dentro del alcance, por lo que aparece vacío. No estoy seguro de cómo resolver esto ... – Yarin

+0

@Yarin Oops, tienes razón, este es el 'uso ($ d)' que falta por completo. Fijo. – phihag

+0

@ phihag- Sí, lo descubrí demasiado, buena solución. – Yarin

15
foreach(glob('directory/*', GLOB_ONLYDIR) as $dir) { 
    $dir = str_replace('directory/', '', $dir); 
    echo $dir; 
} 

Se puede utilizar simplemente glob con GLOB_ONLYDIR y luego filtrar los directorios resultado

+0

me funciona a la perfección. Enumera solo los directorios. Gracias – Imtiaz

5

Lista sólo las carpetas (directorios):

<?php 
$Mydir = ''; ### OR MAKE IT 'yourdirectory/'; 

foreach(glob($Mydir.'*', GLOB_ONLYDIR) as $dir) { 
    $dir = str_replace($Mydir, '', $dir); 
    echo $dir; 
} 
?> 
+1

También podría usar echo nombre base ($ dir); en lugar de str_replace –

1

Intente esto con glob('*') función

<?php 
    $dirs = array_filter(glob('*'), 'is_dir'); 
    $i = 1; 
    foreach ($dirs as $value) { 
     echo $i . '. &nbsp; <a href = "http://localhost/' . $value . '" target = "_blank">' . $value . '</a><br>'; 
     $i++; 
    } 
    ?> 

Arriba el código funcionó para mí para la lista de carpetas en el directorio actual y desarrollé más código para abrir cada carpeta en una nueva pestaña en el mismo navegador. Esto es solo muestra directorios.

1

También se puede utilizar en formularios para crear un menú desplegable de nombres de carpeta (aquí está la carpeta de imágenes). Asegura que un usuario la posibilidad de subir una imagen lo empuja a la carpeta correcta :-)

<select name="imgfolder"> 
    <option value="genimage">General Image</option> 
    <?php 
    $Mydir = '../images/'; // use 'anydirectory_of_your_choice/'; 

    foreach(glob($Mydir.'*', GLOB_ONLYDIR) as $dir) { 
    $dirname = basename($dir) ; 
    echo '<option value="' . $dirname . '">' . $dirname . '</option>' ; 
    } 
    ?> 
    </select> 
Cuestiones relacionadas