我有一个充满代理服务器的文本文件。有些人在开头注释了#,不应该使用。我尝试使用下面的代码执行此操作,但它仍然选择注释行。我哪里错了?
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循环,直到它选择一个代码(随机),它在开头没有#,而不是每次都调用该函数并重新加载文件。
帮助!
答案 0 :(得分:0)
实际上,处理问题的最佳方法是删除任何已评论的行,然后才选择随机结果。
否则你可能会有一个非常糟糕的运气连胜或一个包含数千个评论行和一个或两个活跃的文件,并且会等待几个小时让随机选择一行有效。
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);});
答案 1 :(得分:-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;
}