Php 在While结束之前忽略每个状态

Php 在While结束之前忽略每个状态,php,foreach,while-loop,whitespace,fgets,Php,Foreach,While Loop,Whitespace,Fgets,为什么此代码只在文件dirs.txt中列出的最后一个目录上工作,而不是在该文件中列出的每个目录上工作。它似乎忽略了foreachstation,直到while循环结束 <?php $handle = fopen("dirs.txt", "r"); $tmpDir = "/tmp/"; if ($handle) { while (($dir = fgets($handle)) !== false) { foreach(glob

为什么此代码只在文件
dirs.txt
中列出的最后一个目录上工作,而不是在该文件中列出的每个目录上工作。它似乎忽略了
foreach
station,直到
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);
?>

我看不到任何错误,只是最后一个目录正在处理。所有目录都很好,里面有文件,我可以手动打开。如果我从文件中删除/etc/find/music/,那么/home/music/将被删除

我怀疑
fgets
正在返回文件中的每一行,并且换行符仍然附加在字符串的末尾。但是您的最后一个字符串(假设您没有在文件末尾输入空行)将不包含换行符。如果是这种情况,那么可能是
glob
方法试图查找目录路径中的文件,该路径被换行符一分为二,如下所示:

/home/mp3/
*love*.mp3
这将无法正确匹配。因此,
glob
函数返回一个空数组,这使foreach循环无需处理任何内容,因此,
while
循环跳过文件的下一行,直到文件的最后一行出现相同的问题,该行不以换行符结尾

尝试将其作为
循环的第一行插入,而
循环:

$dir = trim($dir);

这将删除任何换行符,并使字符串适合在
glob
函数中使用。

您是否可以编辑您的问题,将
dirs.txt
的内容包括在内,以便我们可以看到是什么导致while循环跳到该文件中的最后一个条目?运行上述代码时会发生什么?您是否看到按预期复制的
/etc/find/music
MP3文件,以及查看主目录中包含的MP3文件的
无法copy FILE
?是否有可能您的主目录实际上应该是
/home/username/mp3/
/home/username/music/
(注意用户名已经添加)。如果主目录路径错误,那么您的代码将无法从中读取文件。我看不到任何错误,只处理最后一个目录。所有目录都很好,里面有文件,我可以手动打开所有目录。如果我从文件中删除/etc/find/music/,则/home/music/将完成
$dir = trim($dir);