2010-02-24 14 views

Odpowiedz

8

zapisać swoje informacje do tablicy, sortowanie tablicy, a następnie pętli tablicy

if($h = opendir($dir)) { 
    $files = array(); 
    while(($file = readdir($h) !== FALSE) 
    $files[] = stat($file); 

    // do the sort 
    usort($files, 'your_sorting_function'); 

    // do something with the files 
    foreach($files as $file) { 
    echo htmlspecialchars($file); 
    } 
} 
2

Heh, nawet wielki DirectoryIterator może to zrobić po wyjęciu z pudełka. Westchnienie.

Wydaje się, że istnieje całkiem potężny skrypt, który wykona wszystko, o czym tutaj mowa: preg_find. Nigdy z nim nie pracowałem, ale wygląda dobrze.

sorted in by filesize, in descending order? 
$files = preg_find('/./', $dir, 
    PREG_FIND_RECURSIVE| PREG_FIND_RETURNASSOC | 
    PREG_FIND_SORTFILESIZE|PREG_FIND_SORTDESC); 

$files=array_keys($files); 
0

Można użyć scandir() czytać zawartość katalogu do tablicy, a następnie użyć fileatime() lub filectime() zobaczyć dostępu lub tworzenia czasu każdego pliku, odpowiednio. Sortowanie tablicy tutaj nie powinno być zbyt trudne.

3

Możesz przechowywać pliki w tablicy, gdzie klucz jest nazwą pliku, a wartością jest wartość do sortowania według (np. Data utworzenia) i użyć asort() w tej tablicy.

$files = array(
    'file1.txt' => 1267, 
    'file3.txt' => 1267011892, 
    'file2.txt' => 1266971321, 
); 
asort($files); 
var_dump(array_keys($files)); 
# Output: 
array(3) { 
    [0]=> 
    string(9) "file2.txt" 
    [1]=> 
    string(9) "file3.txt" 
    [2]=> 
    string(9) "file1.txt" 
} 
-2

użycie shell_exec na polecenie na poziomie systemu operacyjnego wykonać? na systemie Linux/Unix może to zadziałać;

$output=shell_exec('ls -t1'); 
+3

... proszę nie. – knittl

5

To moje rozwiązanie:

$fileList = array(); 
$files = glob('home/dir/*.txt'); 
foreach ($files as $file) { 
    $fileList[filemtime($file)] = $file; 
} 
ksort($fileList); 
$fileList = array_reverse($fileList, TRUE); 
print_r($filelist); 

wyjście jest tak:

array(
    (int) 1340625301 => '/home/dir/file15462.txt', 
    (int) 1340516112 => '/home/dir/file165567.txt', 
    (int) 1340401114 => '/home/dir/file16767.txt' 
) 

Następnie z "foreach" pętli wziąć plik trzeba.

+0

Pozwala mieć nadzieję, że żaden z twoich plików nie zostanie zmodyfikowany w tej samej sekundzie czasu uniksowego. – salathe

+0

@salathe Dobry punkt! – trante

+0

Zastąpiłem linię nadwozia foreach przez: $ fileList [plik_własku (plik $). $ Plik] = plik $; Rozwiązuje to problem z wymienionymi wzmiankami. Mam wrażenie, że ta kluczowa konwersja na ciąg również sprawia, że ​​ksort jest znacznie szybszy dla moich plików 300k. –

Powiązane problemy