-1

プロキシ サーバーでいっぱいのテキスト ファイルがあります。一部は先頭に # を付けてコメントしているため、使用しないでください。以下のコードを使用してこれを実行しようとしましたが、まだコメント行が選択されています。どこが間違っていますか?

function getProxy()
{
    $file = file('proxy.txt',FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

    $line = $file[array_rand($file)];

    if (strpos($line,'#') !== FALSE) { getProxy(); }

    return $line;
}

理想的には、毎回関数を呼び出してファイルをリロードするのではなく、先頭に # がないプロキシを (ランダムに) 選択するまで、コードは何らかの形式の while ループを実行する必要があると思います。

ヘルプ!

4

2 に答える 2

0

実際、この問題を処理する最善の方法は、コメントされている行をすべて削除してから、ランダムな結果を選択することです。

そうしないと、非常に不運が続くか、何千ものコメント行と 1 つまたは 2 つのアクティブなファイルがある可能性があり、無作為に有効な 1 行が選択されるまで何時間も待つことになります。

function getProxy()
{
    $file = file('proxy.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

    foreach ($file as $key => $line) {
        if (strpos(ltrim($line), "#") === 0) {
            unset($file[$key]);
        }
    }

    $line = $file[array_rand($file)];

    return $line;
}

array_filter()代わりに、次のように使用できます。

$file = array_filter($file, function($value){return !(strpos(ltrim($value), "#") === 0);});
于 2013-07-28T12:46:17.030 に答える
-1

true - ここではループの方が優れています:

function getProxy()
{
    $file = file('proxy.txt',FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

    do {

       $line = $file[array_rand($file)];

    } while(strpos($line,'#') !== FALSE);

    return $line;
}

また、いくつかの追加条件を追加する必要があります-ファイルにコメント行のみがある場合、無限ループが作成されるため、より良いアイデアは次のとおりです。

function getProxy()
{
    $maxChecks=100;
    $i=0;
    $file = file('proxy.txt',FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

    do {
       $line = $file[array_rand($file)];
       if($i++>$maxChecks) break;
    } while(strpos($line,'#') !== FALSE);

    if($i>$maxChecks)
       return false;

    return $line;
}
于 2013-07-28T10:34:31.107 に答える