Пока игнорировать foreach statment, пока не закончится

Почему этот код работает только в последнем каталоге, указанном в файле dirs.txt вместо того, чтобы работать с каждым каталогом, указанным в этом файле. Кажется, игнорировать foreach Устав до while цикл заканчивается.

 <?php
$handle = fopen("dirs.txt", "r");
$tmpDir = "/tmp/";
if ($handle) {
while (($dir = fgets($handle)) !== false) {
foreach(glob($dir."*love*.mp3") as $file) {
if (!copy($file, $tmpDir.basename($file))) {
echo "Cant copy $file...\n";
}
}
}
} else {
}
fclose($handle);
?>

Файл dirs.txt — это новый список разделенных строк

/home/mp3/
/home/music/
/etc/find/music/

Я не вижу никакой ошибки, только последний каталог обрабатывает. Все каталоги хороши и файлы существуют внутри, и все они я могу открыть вручную. Если я удалю / etc / find / music / из файла, то / home / music / будет готов

-1

Решение

Я подозреваю что fgets возвращает каждую строку из вашего файла с символами новой строки, все еще прикрепленными к концу строки. Но ваша последняя строка (при условии, что вы не вводите пустую строку в конце файла) не будет содержать символа новой строки. Если это так, то, возможно, glob Метод пытается найти файлы в пути к каталогу, который разбивается на две части символом новой строки, примерно так:

/home/mp3/
*love*.mp3

который не собирается соответствовать правильно. Итак glob Функция возвращает пустой массив, который не дает циклу foreach работать, поэтому while Цикл пропускает до следующей строки вашего файла, затрагивая ту же проблему до последней строки файла, которая не заканчивается символом новой строки.

Попробуйте вставить это в качестве первой строки вашего while цикл:

$dir = trim($dir);

Это должно удалить любой символ новой строки и сделать строку пригодной для использования в glob функция.

1

Другие решения

Других решений пока нет …