0

多くのフォルダのみを含むディレクトリがあり、それらの各フォルダにはURLを含むテキストファイルがあります。私がやろうとしているのは、各フォルダでそのテキストファイルを開き、それを編集して各 URL を \n 文字で区切った 1 行の 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

foreach() ループで $text を動的にしたいようですが、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 に答える
0

あなたが達成しようとしていることを私が正しく理解していれば、解決すべき問題がいくつかあります。ディレクトリ ツリーをたどる場合は、いくつかの関数を作成して再帰的に実行する必要があるでしょう。また、$filereaddir から取得した がファイルなのか別のディレクトリなのかを確認する必要があります。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);
        }
    }

この例では、readdir ではなく scandir を使用していますが、アイデアを得ることができます。次の「ファイル」がディレクトリかファイルかをチェックし、ディレクトリの場合は同じ import_directory 関数を再度呼び出します。ファイルの場合は、必要な作業を何でも行うことができます。あなたの場合、ファイルの内容を読み込んで、内容を少し変更して、別のファイルに書き出すように聞こえます。

ファイルがすべての内容を含む最後のフォルダーにのみ作成される理由についての特定の質問に答えるには、ディレクトリの内容に対して完全な while ループを実行するためです (毎回 $members 配列を更新します)。そのループが完了したら、$members 配列を foreach で 1 回だけ処理します。期待どおりに動作させるには、ファイルが読み取られた後、$members 配列 (つまり、ファイルの内容) を処理する foreach ループをメインの while ループ内に移動する必要があります。または、(fgets を使用して) 一度に 1 行ずつファイルの内容を読み取るので、同じループでその行を新しいファイルに書き込むことができます (たとえば、行を読み取って行を書き込む)。

しかし、ディレクトリ ツリーの処理に関しては、再帰関数を使用することを強くお勧めします。再帰関数を使用すると、より単純で理解しやすくなります (少なくとも私にとっては!)。

于 2013-05-19T16:18:21.900 に答える