1 Stimmen

PHP: readdir nach scandir?

Ich frage mich, wie ich genau das folgende Stück Code umwandeln kann in scandir anstelle von readdir ?

$path = 'files';

//shuffle files
$count = 0;
if ($handle = opendir($path)) {
    $retval = array();
    while (false !== ($file = readdir($handle))) {
        $ext = pathinfo($file, PATHINFO_EXTENSION);
        if ($file != '.' && $file != '..' && $file != '.DS_Store' &&
          $file != 'Thumbs.db') {
            $retval[$count] = $file;
            $count = $count + 1;
            } else {
            //no proper file
        }
    }
    closedir($handle);
}
shuffle($retval);

2voto

Pascal MARTIN Punkte 384469

scandir zurück, zitiert nach :

Gibt ein Array von Dateinamen auf Erfolg ein Array von Dateinamen zurück, oder FALSE bei einem Fehler.

Das bedeutet, dass Sie die vollständige Liste der Dateien in einem Verzeichnis erhalten -- und diese dann filtern können, indem Sie entweder eine benutzerdefinierte Schleife mit foreach oder eine Filterfunktion wie array_filter .

Nicht getestet, aber ich nehme an, so etwas sollte funktionieren:

$path = 'files';
if (($retval = scandir($path)) !== false) {
    $retval = array_filter($retval, 'filter_files');
    shuffle($retval);
}

function filter_files($file) {
    return ($file != '.' && $file != '..' && $file != '.DS_Store' && $file != 'Thumbs.db');
}

Im Grunde genommen, hier :

  • Zuerst erhalten Sie die Liste der Dateien, indem Sie scandir
  • Dann filtern Sie die unerwünschten heraus, indem Sie array_filter und eine benutzerdefinierte Filterfunktion
    • Hinweis: Diese benutzerdefinierte Filterfunktion könnte mit einer anonymen Funktion geschrieben worden sein, mit PHP >= 5.3
  • Und schließlich, Sie shuffle das resultierende Array.

1voto

robjmills Punkte 18099

Ich bin mir nicht sicher, warum Sie das tun wollen, aber hier ist eine viel präzisere Lösung:

$path = 'files';
$files = array();
foreach (new DirectoryIterator($path) as $fileInfo) {
    if($fileInfo->isDot() || $fileInfo->getFilename() == 'Thumbs.db') continue;
    $files[] = $fileInfo->getFilename();
}
shuffle($files);

1voto

svens Punkte 10900

Bei solchen Problemen sollte man immer das PHP-Handbuch zu Rate ziehen und die Kommentare lesen, das ist immer sehr hilfreich. Es besagt, dass scandir gibt ein Array zurück, so dass Sie es mit foreach .

Um einige Einträge des Arrays löschen zu können, hier ein Beispiel mit for :

$exclude = array( ".", "..", ".DS_Store", "Thumbs.db" );
if( ($dir = scandir($path)) !== false ) {
    for( $i=0; $i<count($dir); $i++ ) {
        if( in_array($dir[$i], $exclude) )
            unset( $dir[$i] );
    }
}

$retval = array_values( $dir );

Werfen Sie auch einen Blick auf die SPL-Iteratoren PHP bietet, insbesondere RecursiveDirectoryIterator et DirectoryIterator .

0voto

3Dos Punkte 2575

Hier ist eine kleine Funktion, um ein Verzeichnis zu scannen, ohne die lästigen Dateien zu erhalten.

function cleanscandir ($dir) {
  $list = [];
  $junk = array('.', '..', 'Thumbs.db', '.DS_Store');
  if (($rawList = scandir($dir)) !== false) {
    foreach (array_diff($rawList, $junk) as $value) {
      $list[] = $value;
    }
    return $list;
  }
  return false;
}

Gibt ein Array oder false aus, genau wie scandir tut

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X