2011-10-04 16 views
15

ディレクトリ内のファイルをリストするには、PHPのDirectoryIteratorクラスを使用しています。しかし、日付でファイルを並べ替える簡単な方法を見つけ出すことはできません。これはのDirectoryIteratorphp DirectoryIterator日付でファイルをソート

<?php 
$dir = new DirectoryIterator('.'); 
    foreach ($dir as $fileinfo) {  
    echo $fileinfo->getFilename() . '<br>'; 
    } 
?> 

でどのように行われている何私は数字はミリ秒単位で時間を表しwhatever_2342345345.extように私のファイルに名前を付ける場合ので、各ファイルには固有の番号を持っています。アンダースコアの後の数字を調べることでどのように並べ替えることができますか

答えて

20

並べ替えが必要な場合は、配列を作成して並べ替えます。

$files = array(); 
$dir = new DirectoryIterator('.'); 
foreach ($dir as $fileinfo) {  
    $files[$fileinfo->getMTime()][] = $fileinfo->getFilename(); 
} 

ksort($files); 

これは、修正された時刻をキーとして、ファイル名の配列を値として持つ配列を作成します。次に、ksort()でソートします。これにより、変更された順にファイル名が表示されます。

あなたは、あなたが使うことのできる標準的な配列に構造を再フラット化したい場合は...

$files = call_user_func_array('array_merge', $files); 
+10

私はあなたが間違っていると言っておかなければいけません。 "反復子はちょうどそれを繰り返すために存在します、繰り返します"。その反復子はフィルタリングと順序付け機能を追加することができます。実際、イテレータの目的は反復するインタフェースを提供することですが、この定義はイテレータがデータを使って内部的な仕事を行うことを制限しません。 – zerkms

+0

あなたが提供した例は私のために働いていません。それを試しましたか?ファイル名にwhatever_2342345345.extのような名前を付けるとどうなりますか?数字は各ファイルが一意の番号を持つ時刻を表します。アンダースコアの後の数字を調べるとどうすればいいですか – Pinkie

+0

@Pinkie:私は試していませんが、理論は正しいはずです。どのようなエラーがありましたか? '$ files'を見ていますか? – alex

1

場合、複数のファイルは、同じ更新時刻(更新)があります。

$files = array(); 
$mtimes = array(); 
$dir = new DirectoryIterator('.'); 
foreach($dir as $file){ 
    if(!$file->isFile()) 
    continue; 

    $mtime = $file->getMTime(); 

    if(!$mtimes[$mtime]){ 
    $files[$mtime.'.0'] = $file->getFilename(); 
    $mtimes[$mtime] = 1; 
    }else{ 
    $files[$mtime.'.'.$mtimes[$mtime]++] = $file->getFilename(); 
    } 
} 

ksort($files); 
1

DirectoryIterator(たとえばisDot()getSize()など)のすべてのデータにアクセスする場合は、並べ替えようとしている配列にIteratorキーを格納し、後でDirectoryIteratorを探します。

$sorted_keys = array(); 
$dir_iterator = new DirectoryIterator('.'); 

foreach ($dir_iterator as $fileinfo) 
{ 
    $sorted_keys[$fileinfo->getMTime()] = $fileinfo->key(); 
} 

ksort($sorted_keys); 

/* Iterate `DirectoryIterator` as a sorted array */ 
foreach ($sorted_keys as $key) 
{ 
    $dir_iterator->seek($key); 
    $fileinfo = $dir_iterator->current(); 

    /* Use $fileinfo here as a normal DirectoryIterator */ 
    echo $fileinfo->getFilename() . ' ' . $fileinfo->getSize() . '<br>'; 
} 
関連する問題