Scandir() сортировать по дате изменения
Я пытаюсь сделать функцию scandir();
выше своих письменных ограничений, мне нужно больше, чем альфа-сортировка, которую она в настоящее время поддерживает. Мне нужно отсортировать результаты scandir();
для сортировки по дате изменения.
Я пробовал несколько решений, которые я нашел здесь, и некоторые другие решения с разных сайтов, но никто не работал у меня, поэтому я считаю, что для меня целесообразно публиковать здесь.
Что я пробовал до сих пор:
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 изображений.
Ответы
Ответ 1
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;
}
Ответ 2
Альтернативный пример.
$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>";
}
Ответ 3
Это отличный вопрос, и ответ better_scandir
ответ, но мне нужно было немного больше гибкости для моих нужд, поэтому я создал новую функцию: better_scandir
.
Цель состоит в том, чтобы позволить scandir
порядка сортировки scandir
работать scandir
; не только обратный метод сортировки массива в ответе Района. А также явно SORT_NUMERIC
для сортировки массива, поскольку эти значения времени являются явно числами.
Использование это так; просто переключите SCANDIR_SORT_DESCENDING
на 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
Ответ 4
Я думаю, что проблема в вашем исходном коде - это несколько файлов, которые могут иметь такую же дату и время изменения, поэтому при объединении массивов несколько записей файла с одинаковой датой и временем изменения будут перезаписаны, и вы получите только одну запись в конечном массиве для этой метки времени.