@topalek

Почему функция записывает по 2 раза?

Есть папка со вложенными папками. В конечных лежат файлы, ссылки(пути) на которые надо записать в файл и файл этот должен лежать в конечной папке.
5f10336a31524470816153.png
Есть функция, которая рекурсивно проходит по папкам и записывает пути в файл.
function build($dir) {
    foreach (scandir($dir) as $node) {
        if ($node == '.' || $node == '..') continue;
        if (is_dir($dir . DIRECTORY_SEPARATOR . $node)) {
            build($dir .DIRECTORY_SEPARATOR . $node);
        } else {
            $dirname = dirname($dir . DIRECTORY_SEPARATOR . $node).DIRECTORY_SEPARATOR;
            if ($node !== "index.txt"){
                var_dump($dirname.$node);
                $idxFile = $dirname.'index.txt';
                file_put_contents($idxFile,  $dirname.$node. "\n",FILE_APPEND);
            }
        }
    }
}

В коде можно увидеть var_dump который выводит путь к текущему файлу в браузер перед записью его в файл.
Магия начинается на моменте записи этого пути в файл. Магия заключается в том, что пути записываются по два раза.
Причем если в папке лежат несколько файлов, то запись пройдет сначала по каждому, а потом еще раз. Т.е. если будет в папке 1.txt , 2.bat, 3.dll, то запишется вот так
1.txt
2.bat
3.dll
1.txt
2.bat
3.dll

а в браузере отобразится по одному разу.

Вопрос: как исправить так, чтобы записывалось в файл по одному разу?

З.Ы. через консоль скрипт отрабатывает правильно и запись идет по одному разу
  • Вопрос задан
  • 72 просмотра
Пригласить эксперта
Ответы на вопрос 1
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Во-первых замените dirname() на realpath(). Во-вторых, второй DIRECTORY_SEPARATOR перенесите внутрь круглых скобок realpath(). И в-третьих, не создавайте новых файлов в директории, из которой как раз читаете. Собирайте вывод в переменную, а уже после окончания сканирования директории (т.е. снаружи foreach (scandir($dir) as $node) {}) создавайте файл в сканируемой директории.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы