За последние 24 часа нас посетили 16065 программистов и 1541 робот. Сейчас ищут 873 программиста ...

Как сортировать массив с назв-ми файлов по дате их создания?

Тема в разделе "PHP для новичков", создана пользователем anapkin, 4 янв 2009.

  1. anapkin

    anapkin Активный пользователь

    С нами с:
    18 дек 2008
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Анапа
    Появилась у меня проблемка некоторая. Чтение документации не помогло. Если есть время, пожалуйста, ответьте, как отсортировать массив, содержащий названия текстовых файлов по времени создания самих файлов? Надо, чтобы допустим, название файла, который был создан раньше других - был в массиве первым и т.д.

    PHP:
    1.  
    2.  
    3. $dir = "upload";
    4.  
    5. $files = scandir($dir);
    6.  
    7. print_r ($files);
    8.  
    9.  
    print_r ($files) дает результат по имени:

    А как по дате создания?

    PHP:
    1. $filemtime = filemtime ("$dir/$files[3]");
    2.  
    3. echo $filemtime;
    спасибо.
     
  2. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
  3. egrik

    egrik Активный пользователь

    С нами с:
    22 дек 2006
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Voronezh
    Все-таки, нужно определиться: сортировать по дате создания или дате последнего изменения файла?
    Думаю, что оптимальным вариатом будет получение многомерного массива, к примеру, такого:

    Код (Text):
    1. array([0] => array('fname'=>'01.txt', 'ftime'=>1801548), [1] => array('fname'=>'02.txt', 'ftime'=>1802548))
    далее, используя функцию usort (http://ru2.php.net/manual/ru/function.usort.php), отсортировать данный массив.
     
  4. egrik

    egrik Активный пользователь

    С нами с:
    22 дек 2006
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Voronezh
    Еще, как вариант, можно использовать в качестве ключей дату полследнего изменения, тогда:
    Код (Text):
    1. <?php
    2. function scandir_by_mtime($folder) {
    3.   $dircontent = scandir($folder);
    4.   $arr = array();
    5.   foreach($dircontent as $filename) {
    6.     if ($filename != '.' && $filename != '..') {
    7.       if (filemtime($folder.$filename) === false) return false;
    8.       $dat = filemtime($folder.$filename);
    9.       $arr[$dat] = $filename;
    10.     }
    11.   }
    12.   if (!ksort($arr)) return false;
    13.   return $arr;
    14. }
    15. ?>
    взял здесь http://ru2.php.net/manual/ru/function.scandir.php#51839, немного изменил, но в этом случае, есть баг - если 2 или более файла были модифицированы в одну и ту же секунду, то они в массив не попадут. В общем, лучше использовать мой вариант, предложенный выше.
     
  5. anapkin

    anapkin Активный пользователь

    С нами с:
    18 дек 2008
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Анапа
    egrik! Спасибо большое!

    Elkaz! Тоже спасибо, но я это уже видел и разобраться не смог. Я только начинаю изучать php. Если чтение документации не помогает и уже сломал весь мозг :) - спрашиваю здесь, в надежде на полноценнный ответ :)
     
  6. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    egrik
    много букав. Имя файла всегда уникально - можно юзать в качества ключей массива, время в качестве значений.

    PHP:
    1. <?
    2. $dir = "upload";
    3. $files = array();
    4. foreach (scandir($dir) as $file) $files[$file] = filemtime($file);
    5. asort($files);
    6. $files = array_keys($files);
    7. print_r($files);
     
  7. anapkin

    anapkin Активный пользователь

    С нами с:
    18 дек 2008
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Анапа
    Так все работает:

    PHP:
    1.  
    2. <?php
    3. $dir = "upload";
    4.  $files = array();
    5.  foreach (scandir($dir) as $file) $files[$file] = filemtime("$dir/$file");
    6.  asort($files);
    7.  $files = array_keys($files);
    8.  print_r($files);
    9. ?>
    10.  
    Самый нормальный вариант, спасибо большое! Ато уже начал придумывать, как это сделать через задницу, но чтобы все работало :). Спасибо еще раз!