Если вы посмотрите журнал ошибок для вашего второго примера, вы, вероятно, увидите много таких записей:
PHP Предупреждение: недопустимый тип смещения в / home / ... on строка 9 PHP Трассировка стека: PHP 1. {main} () /home/...
В строке 9 вы строите элементы массива:
$cooked[$file] = filemtime($file);
Проблема в том, что что $file
здесь не строка, это экземпляр SplFileInfo
. Это работает в вашем первом примере, потому что этот класс реализует __toString
, что означает, что filemtime
может справиться с этим. Но использование его непосредственно в качестве ключа массива не сработает.
Простое решение - вручную привести его к строке при добавлении элемента:
$cooked[(string) $file] = filemtime($file);
Альтернатива (лучше?) опцией было бы использовать второй аргумент конструктора для RecursiveDirectoryIterator
, который говорит ему просто дать вам имена файлов в первую очередь:
$raw = new RecursiveDirectoryIterator($rootdir, FilesystemIterator::CURRENT_AS_PATHNAME);