Вопрос по scandir, arrays, sorting, php – scandir () для сортировки по дате изменения

15

Я пытаюсь сделать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 изображений.

Ваш Ответ

3   ответа
0

Я думаю, что проблема в вашем исходном коде заключается в том, что несколько файлов могут иметь одну и ту же дату / время изменения, поэтому при объединении массивов несколько файловых записей с одинаковыми датой / временем изменения будут перезаписаны, и вы получите только одну запись в конечном массиве для этой временной отметки. ,

Я понимаю что ты имеешь в виду. Есть ли способ это исправить? Dugi
79
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;
}
Вы сохранили мое приложение .. Спасибо, дорогой
Пробовал и работал как шарм. Спасибо Ryoin. Dugi
@dugi попробуйте этот метод. Имена файлов в одном каталоге должны быть уникальными. Поэтому их можно использовать как ключ. Затем массив сортируется по значениям (время модификации), а ключи (имена файлов) возвращаются в правильном порядке.
Работает отлично. Чтобы игнорировать все точечные файлы, вы можете использовать массивную индексацию строк вместо in_array для проверки первого символа имени файла: if ($ file [0] === & apos;. & Apos;) continue;
Работай как шарм!
0

$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>"; 
}  

Похожие вопросы