0

我有一个只包含很多文件夹的目录,每个文件夹都有一个包含 url 的文本文件,我想做的是创建一个 php 代码,该代码将在每个文件夹上打开该文本文件并对其进行编辑并制作该 url 在一行中,用 \n 字符分隔每个 url

到目前为止,这是我的代码

$path = "localpath here";

$handle = opendir($path);
while ($file = readdir($handle)) {
    if(substr($file,0,1) !="."){
        $text = preg_replace('/\s+/', '', $file);
        //echo $text."</br>";
        $blast = fopen("$path/$text/$text.txt", 'r') or die("can't open file");
        //echo $blast;
        while (!feof($blast)) {
            $members[] = fgets($blast);
            //echo $members;
        }

    }
}

foreach($members as $x=> $order){
    echo $order."</br>";
    $string = trim(preg_replace('/\s+/', ' ', $order));
    $linksonly = "write.txt";
    $linksonlyHandle = fopen("$path/$text/$linksonly", 'a') or die("can't open file");
    fwrite($linksonlyHandle,$string.'\n');
    fclose($linksonlyHandle);
}

closedir($handle);
4

2 回答 2

0

如果我正确理解了您要完成的工作,那么您需要解决一些问题。如果您要沿着目录树向下走,那么您可能想要创建一些函数并递归地执行它。此外,您需要检查$file从 readdir 获得的内容是文件还是其他目录。您可以使用is_dir函数执行此操作。如果它是一个目录,那么您将需要在其中查找更多文件(和目录)。这就是为什么使用递归函数很有帮助的原因。

我通常会这样做:

function import_directory($directory)
    {
    $files = scandir($directory);
    foreach ($files as $file)
        {
        if ($file == '.' || $file == '..')
            continue;

        if (is_dir($directory.'/'.$file))
            $this->import_directory($directory.'/'.$file);
        else
            $this->import_file($directory.'/'.$file);
        }
    }

该示例使用 scandir 而不是 readdir,但您可以理解。它检查下一个“文件”是目录还是文件,如果是目录,它会再次调用相同的 import_directory 函数。如果它是一个文件,那么你可以做任何你需要做的工作。在您的情况下,这听起来像是读取文件的内容,稍微修改内容,然后将其写入另一个文件。

要回答有关为什么仅在包含所有内容的最后一个文件夹中创建文件的具体问题,那是因为您对目录内容执行了完整的 while 循环(每次更新 $members 数组)。在该循环完成后,您只需在 foreach 中处理一次 $members 数组。为了使它更像您所期望的那样工作,您需要在读取文件后将处理 $members 数组(即文件的内容)的 foreach 循环移动到主 while 循环内。或者更好的是,因为您一次读取一行文件的内容(使用 fgets),您可以在同一个循环中将该行写入新文件(例如读取一行,写入一行)。

但是在处理目录树时,我真的建议使用递归函数,因为它更简单、更容易理解——至少对我来说是这样!

于 2013-05-19T16:18:21.900 回答
0

似乎您希望 $text 在 foreach() 循环中是动态的,但它保留了 while() 循环的最后一次迭代的值。

您可能希望为 $text 创建另一个数组,以便在 foreach() 循环中与 $member[] 一起使用,并具有相同的索引。

$i=0;
$j=0;

$members[$i] = fgets($blast);
$text_array[$i] = $text;
$i++;

$linksonlyHandle = fopen("$path/{$text[$j]}/$linksonly", 'a') or die("can't open file");
$j++;
于 2013-05-19T05:49:20.783 回答