web-dev-qa-db-ja.com

変更された日付でソートするscandir()

私はscandir();関数を書面による制限を超えさせようとしていますが、現在サポートしているアルファソート以上のものが必要です。 scandir();の結果を並べ替えて、変更日で並べ替える必要があります。

ここで見つけたいくつかの解決策と、さまざまなWebサイトのいくつかの解決策を試しましたが、うまくいきませんでした。

私がこれまで試したのはこれです:

function scan_dir($dir)
{
    $files_array = scandir($dir);
    $img_array   = array();
    $img_dsort   = array();
    $final_array = array();

    foreach($files_array as $file)
    {
        if(($file != ".") && ($file != "..") && ($file != ".svn") && ($file != ".htaccess"))
        {
            $img_array[] = $file;
            $img_dsort[] = filemtime($dir . '/' . $file);   
        }
    }

    $merge_arrays = array_combine($img_dsort, $img_array);
    krsort($merge_arrays);

    foreach($merge_arrays as $key => $value)
    {
        $final_array[] = $value;    
    }

    return (is_array($final_array)) ? $final_array : false;
}

しかし、これは私には機能しないようで、3つの結果のみを返しますが、フォルダーに16個の画像があるため、16個の結果を返すはずです。

20
Dugi
function scan_dir($dir) {
    $ignored = array('.', '..', '.svn', '.htaccess');

    $files = array();    
    foreach (scandir($dir) as $file) {
        if (in_array($file, $ignored)) continue;
        $files[$file] = filemtime($dir . '/' . $file);
    }

    arsort($files);
    $files = array_keys($files);

    return ($files) ? $files : false;
}
85
Ryon Sherman

これは素晴らしい質問です。 Ryon Shermanの答え は確かな答えを提供しますが、ニーズにもう少し柔軟性が必要だったので、この新しい関数を作成しました:better_scandir

目標は、 scandir ソート順フラグが期待どおりに機能するようにすることです。リヨンの答えの逆配列ソート方法だけではありません。また、明示的に設定 SORT_NUMERIC 配列ソートの場合、これらの時間値は明らかに数値であるためです。

使用方法は次のとおりです。ただスイッチアウト SCANDIR_SORT_DESCENDING to SCANDIR_SORT_ASCENDING またはデフォルトで空のままにします:

better_scandir(<filepath goes here>, SCANDIR_SORT_DESCENDING);

そして、ここに関数自体があります:

function better_scandir($dir, $sorting_order = SCANDIR_SORT_ASCENDING) {

  /****************************************************************************/
  // Roll through the scandir values.
  $files = array();
  foreach (scandir($dir, $sorting_order) as $file) {
    if ($file[0] === '.') {
      continue;
    }
    $files[$file] = filemtime($dir . '/' . $file);
  } // foreach

  /****************************************************************************/
  // Sort the files array.
  if ($sorting_order == SCANDIR_SORT_ASCENDING) {
    asort($files, SORT_NUMERIC);
  }
  else {
    arsort($files, SORT_NUMERIC);
  }

  /****************************************************************************/
  // Set the final return value.
  $ret = array_keys($files);

  /****************************************************************************/
  // Return the final value.
  return ($ret) ? $ret : false;

} // better_scandir
2
JakeGould

別の例..

$dir = "/home/novayear/public_html/backups";
chdir($dir);
array_multisort(array_map('filemtime', ($files = glob("*.{sql,php,7z}", GLOB_BRACE))), SORT_DESC, $files);
foreach($files as $filename)
{
  echo "<a>".substr($filename, 0, -4)."</a><br>"; 
}  
1
NovaYear

あなたの元のコードの問題は、複数のファイルが同じ修正日時を持つ可能性があるため、配列を結合すると同じ修正日時の複数のファイルエントリが上書きされ、そのタイムスタンプの最終配列に1つのエントリのみが取得されると思います。

0
bpatel