2010-04-19 32 views
41

que actualmente tiene un archivo index.php que me permite dar salida a la lista de archivos dentro del mismo directorio, la salida muestra los nombres Luego utiliza filemtime() para mostrar la fecha en que el archivo fue modificado. mi problema ahora es, ¿cómo ordenaré la salida para mostrar el último archivo modificado? He estado pensando por un tiempo cómo hacer esto. si solo lo hago con interacción mysql no habrá ningún problema. por favor, muéstreme un ejemplo de cómo ordenar y sacar la lista de archivos a partir de la última modificación. Esto es lo que tengo por ahoraarchivos ordenar por fecha en PHP

if ($handle = opendir('.')) { 
while (false !== ($file = readdir($handle))) { 
     if ($file != "." && $file != "..") { 
     $lastModified = date('F d Y, H:i:s',filemtime($file)); 
      if(strlen($file)-strpos($file,".swf")== 4){ 
      echo "<tr><td><input type=\"checkbox\" name=\"box[]\"></td><td><a href=\"$file\" target=\"_blank\">$file</a></td><td>$lastModified</td></tr>"; 
      } 
     } 
    } 
    closedir($handle); 
} 

Respuesta

19

Es necesario poner los archivos en una matriz con el fin de ordenar y encontrar el último archivo modificado.

$files = array(); 
if ($handle = opendir('.')) { 
    while (false !== ($file = readdir($handle))) { 
     if ($file != "." && $file != "..") { 
      $files[filemtime($file)] = $file; 
     } 
    } 
    closedir($handle); 

    // sort 
    ksort($files); 
    // find the last modification 
    $reallyLastModified = end($files); 

    foreach($files as $file) { 
     $lastModified = date('F d Y, H:i:s',filemtime($file)); 
     if(strlen($file)-strpos($file,".swf")== 4){ 
      if ($file == $reallyLastModified) { 
      // do stuff for the real last modified file 
      } 
      echo "<tr><td><input type=\"checkbox\" name=\"box[]\"></td><td><a href=\"$file\" target=\"_blank\">$file</a></td><td>$lastModified</td></tr>"; 
     } 
    } 
} 

No probado, pero así es como hacerlo.

+14

@sasori tenga en cuenta que esta solución no funcionará correctamente cuando tenga archivos con el mismo mtime, ya que sobrescribirá el nombre de archivo anterior para ese mtime. – Gordon

+2

Exactamente Gordon, ojalá hubiera habido una forma de que los comentarios de BUMP fueran más visibles ya que he pasado una hora investigando lo que estaba mal ... Aparentemente, la idea detrás del código anterior es correcta, pero este error lo hace absolutamente inútil . –

+0

Editó el código para hacer que la clave sea única (al agregar repetidamente un segundo). Confundirá un poco las cosas cuando algunos archivos tengan tiempos de reproducción de un segundo diferentes (pero no idénticos), pero eso no importará en la mayoría de los casos. –

137

Esto sería obtener todos los archivos en la ruta/a/archivos con la extensión .swf en una matriz y luego ordenar ese arreglo al mtime del fichero

$files = glob('path/to/files/*.swf'); 
usort($files, function($a, $b) { 
    return filemtime($a) < filemtime($b); 
}); 

El arriba usa un Lambda function y requiere PHP 5.3. Antes de 5,3, que haría

usort($files, create_function('$a,$b', 'return filemtime($a)<filemtime($b);')); 

Si no desea utilizar una función anónima, sólo puede así definir la devolución de llamada como función regular y pasar el nombre de la función a usort lugar.

Con la matriz resultante, usted entonces iterar sobre los archivos de la siguiente manera:

foreach($files as $file){ 
    printf('<tr><td><input type="checkbox" name="box[]"></td> 
      <td><a href="%1$s" target="_blank">%1$s</a></td> 
      <td>%2$s</td></tr>', 
      $file, // or basename($file) for just the filename w\out path 
      date('F d Y, H:i:s', filemtime($file))); 
} 

Tenga en cuenta que debido a que ya ha llamado filemtime al ordenar los archivos, no hay ningún costo adicional al llamar de nuevo en el foreach loop debido al stat cache.

+2

-1 Usted no utilizan su código y usort es la función de clasificación peor a utilizar en ese caso. Pero diablos, todos votan por ti porque parece elegante. * - * – elias

+30

@elias Sin ofender, pero me parece bastante ridículo rechazar una respuesta perfectamente válida por las razones que usted dio. Hablando de legibilidad, su código tarda mucho más en descubrir que el mío. Yo lo llamaría código de Spaghetti. Y si no está contento con el hecho de que sea tan terrible, entonces presente una queja con el rastreador de errores de PHP. – Gordon

+0

Concedido que esta pregunta es eternidad, estoy a punto de utilizar 'usort()' en este momento; Orar, ¿cuál es el problema con 'usort()'? (En relación al comentario @elias arriba.) –

8

Un ejemplo que utiliza RecursiveDirectoryIterator clase, es una manera conveniente para recorrer de forma recursiva sobre el sistema de archivos.

$output = array(); 
foreach(new RecursiveIteratorIterator( 
    new RecursiveDirectoryIterator('path', FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS)) as $value) {  
     if ($value->isFile()) { 
      $output[] = array($value->getMTime(), $value->getRealPath()); 
     } 
} 

usort ($output, function($a, $b) { 
    return $a[0] > $b[0]; 
}); 
+0

las personas deben adoptar el enfoque OOP en PHP para hacerlo competitivo a otros idiomas. –

+1

@ RaheelKhan ¿Por qué? Use OOP cuando resuelve problemas más fácilmente, no use OOP cuando es más complicado. OOP no hace nada mejor, ni su código, ni un lenguaje. Simplemente permite resolver ciertos problemas de manera más eficiente (lo que no creo que sea el caso aquí). –

+0

+1 para '' '; No entendí por qué otras respuestas fallaron en lo que respecta a mi código, pero el tuyo tuvo éxito. El operador de comparación correcto: '>' en lugar de '<'. – 1111161171159459134

0

Utilizo su código propuesto exacto con solo algunas líneas adicionales. La idea es más o menos lo mismo de la propuesta por @elias, pero en esta solución no puede haber conflictos en las teclas, ya que cada archivo en el directorio tiene un nombre de archivo diferente y por lo que añadir a la clave resuelve los conflictos. La primera parte de la clave es la cadena de fecha y hora formateada de manera que pueda comparar lexicográficamente dos de ellas.

if ($handle = opendir('.')) { 
    $result = array(); 
    while (false !== ($file = readdir($handle))) { 
     if ($file != "." && $file != "..") { 
      $lastModified = date('F d Y, H:i:s',filemtime($file)); 
      if(strlen($file)-strpos($file,".swf")== 4){ 
       $result [date('Y-m-d H:i:s',filemtime($file)).$file] = 
        "<tr><td><input type=\"checkbox\" name=\"box[]\"></td><td><a href=\"$file\" target=\"_blank\">$file</a></td><td>$lastModified</td></tr>"; 
      } 
     } 
    } 
    closedir($handle); 
    krsort($result); 
    echo implode('', $result); 
} 
-1

$ archivos = array_diff (scandir ($ dir, SCANDIR_SORT_DESCENDING), array ('.. ')'.'); print_r ($ archivos);

Cuestiones relacionadas