echo Recursiveiteratoriterator выводит в качестве ключа в массиве - PullRequest
0 голосов
/ 29 апреля 2020

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

Код без упорядочивания работает нормально :

<?php
try {
    $rootdir = $_SERVER['DOCUMENT_ROOT'];
    $raw = new RecursiveDirectoryIterator($rootdir);
    $cooked = array();
    $yesdate = strtotime("-5 year");
    foreach(new RecursiveIteratorIterator($raw) as $file) {
        if (filemtime($file) >= $yesdate) {
            $cooked[] = $file;
        }
    } 
    foreach($cooked as $file) {
        echo date("F d Y H:i:s.", filemtime($file)) . $file . ' ' . '<br />';
    }    
} catch (Exception $ex) {
    echo $ex->getMessage();
}

Но как только я использую $ file в качестве ключа массива и filemtime ($ file) в качестве значения, порядка и попытки l oop и echo, я получаю код 200, но страница получается белой, не могу понять, почему:

<?php
try {
    $rootdir = $_SERVER['DOCUMENT_ROOT'];
    $raw = new RecursiveDirectoryIterator($rootdir);
    $cooked = array();
    $yesdate = strtotime("-5 year");
    foreach(new RecursiveIteratorIterator($raw) as $file) {
        if (filemtime($file) >= $yesdate) {
            $cooked[$file] = filemtime($file); // $file as key , mod datetime as value 
        }
    } 
    asort($cooked); // Sort
    foreach($cooked as $key => $value) {
        echo $key; // for example
        echo $value;
        //echo date("F d Y H:i:s.", filemtime($file)) . $file . ' ' . '<br />';
    }    
} catch (Exception $ex) {
    echo $ex->getMessage();
}

Что не так с этим кодом?

Спасибо

1 Ответ

2 голосов
/ 29 апреля 2020

Если вы посмотрите журнал ошибок для вашего второго примера, вы, вероятно, увидите много таких записей:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...