1

私のコードが40ファイルのうち20ファイルしか出力しない理由を誰かに教えてもらえますか

$Files = array();
  $dir = new DirectoryIterator('./images/gallery');
  foreach($dir as $fileinfo){
    if($fileinfo->isFile()){
      $Files[$fileinfo->getMTime()] = $fileinfo->getFilename();
    }
  }
  krsort($Files);          
  foreach($Files as $file){
    echo "<a rel='fancy1' href='/images/gallery/$file'><span><img src='/images/revelsmashy.php?src=/images/gallery/$file&w=128&zc=0&q=100'></span></a>\n";
  }

編集:私は画像が最初に投稿された最新のものでアップロードされたデータ時間に基づいて画像を並べ替えることを探しています

4

1 に答える 1

3

ファイルの変更時間によって配列にインデックスを付ける元の方法は、同じmtime値を持つファイルが以前の配列キーを上書きする結果になるようです。状況によっては、ディレクトリ全体が一度に書き換えられた場合、すべてのファイルの変更時間が同じになる可能性があるため、最後に反復されたものだけが結果の配列に含まれます。

最終的に時間で並べ替える必要がある場合は、代わりに、ファイル名とファイルの変更時間の両方を保持する多次元配列を作成し、 を使用して並べ替えることができますusort()

$dir = new DirectoryIterator('./images/gallery');
foreach($dir as $fileinfo){
  if($fileinfo->isFile()){
    // Append each file as an array with filename and filetime keys
    $Files[] = array(
      'filename' => $fileinfo->getFilename(), 
      'filetime' => $fileinfo->getMtime()
    );
  }
}

// Then perform a custom sort:
// (note: this method requires PHP 5.3. For PHP <5.3 the you have to use a named function instead.
// see the usort() docs for examples )
usort($Files, function($a, $b) {
  if ($a['filetime'] == $b['filetime']) return 0;
  return $a['filetime'] < $b['filetime'] ? -1 : 1;
});

出力ループで、filenameキーにアクセスします。

foreach($Files as $file){
    echo "<a rel='fancy1' href='/images/gallery/{$file['filename']}'><span><img src='/images/revelsmashy.php?src=/images/gallery/{$file['filename']}&w=128&zc=0&q=100'></span></a>\n";
    //-----------------------------------------^^^^^^^^^^^^^^^^^^^^
}
于 2012-12-28T20:16:20.767 に答える