PHP: Рекурсивный Итератор - Как отсортировать по дате, новейший спуск? [Дубликат]

AFAICS никто еще не разместил соответствующую часть документации :

Значения параметров по умолчанию оцениваются при выполнении определения функции. Это означает, что выражение оценивается один раз, когда функция определена, и что для каждого вызова используется одно и то же «предварительно вычисленное» значение. Это особенно важно для понимания, когда параметр по умолчанию является изменяемым объектом, таким как список или словарь: если функция изменяет объект (например, добавив элемент в список), значение по умолчанию изменяется. Обычно это не то, что было предназначено. Способ вокруг этого - использовать None как значение по умолчанию и явно проверить его в теле функции [...]

15
задан Pinkie 4 October 2011 в 02:01
поделиться

3 ответа

Если вам нужно отсортировать, построить массив и отсортировать его.

$files = array();
$dir = new DirectoryIterator('.');
foreach ($dir as $fileinfo) {     
   $files[$fileinfo->getMTime()][] = $fileinfo->getFilename();
}

ksort($files);

Это приведет к созданию массива с измененным временем в качестве ключа и массивом имен файлов в качестве значения. Затем он сортируется через ksort() , что даст вам имена файлов в порядке изменения времени.

Если вы хотите повторно свернуть структуру до стандартного массива, вы можно использовать ...

$files = call_user_func_array('array_merge', $files);
20
ответ дан alex 21 August 2018 в 07:52
поделиться
  • 1
    Я должен сказать, что вы немного ошибаетесь, говоря: «Итератор существует, чтобы сделать это, итерации». Итераторы по своему характеру могут добавлять функции фильтрации и упорядочения. Действительно, целью итератора является предоставление интерфейса для итерации, но это определение не ограничивает итератор выполнением некоторых внутренних заданий с данными. – zerkms 4 October 2011 в 01:50
  • 2
    Пример, который вы предоставили, не работает для меня. Вы попробовали. Что делать, если я называю мои файлы вроде any_2342345345.ext, где числа представляют время, когда каждый файл имеет уникальный номер. Как мы можем сортировать, глядя на цифры после подчеркивания – Pinkie 4 October 2011 в 01:56
  • 3
    @Pinkie: вы должны указать все, что-то в вопросе, перед SO-ответчики потратили время на ответ на ваш вопрос (который на самом деле не содержит существенных деталей) – zerkms 4 October 2011 в 01:58
  • 4
    есть проблема с этим, что, если более одного файла имеют одинаковый getMTime? Я знаю, что это сложно, но не невозможно – aleation 20 September 2013 в 12:30
  • 5
    @CommaToast Я собираюсь исправить это. – alex 18 November 2014 в 00:02

Если несколько файлов имеют одинаковое измененное время (обновлено):

$files = array();
$mtimes = array();
$dir = new DirectoryIterator('.');
foreach($dir as $file){
  if(!$file->isFile())
    continue;

  $mtime = $file->getMTime();

  if(!$mtimes[$mtime]){
    $files[$mtime.'.0'] = $file->getFilename();
    $mtimes[$mtime] = 1;
  }else{
    $files[$mtime.'.'.$mtimes[$mtime]++] = $file->getFilename();
  }
}

ksort($files);
1
ответ дан Daniel Prol 21 August 2018 в 07:52
поделиться

Если вы все еще хотите получить доступ ко всем данным, доступным в DirectoryIterator (например, isDot() getSize() и т. д.), возможно, это сохранить ключ Iterator в массиве, который вы собираетесь сортировать, и искать DirectoryIterator позже.

$sorted_keys = array();
$dir_iterator = new DirectoryIterator('.');

foreach ( $dir_iterator as $fileinfo )
{
    $sorted_keys[$fileinfo->getMTime()] = $fileinfo->key();
}

ksort($sorted_keys);

/* Iterate `DirectoryIterator` as a sorted array */
foreach ( $sorted_keys as $key ) 
{
    $dir_iterator->seek($key);
    $fileinfo = $dir_iterator->current();

    /* Use $fileinfo here as a normal DirectoryIterator */
    echo $fileinfo->getFilename() . '  ' . $fileinfo->getSize() . '<br>';
}
2
ответ дан Luis de Arquer 21 August 2018 в 07:52
поделиться
Другие вопросы по тегам:

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