Php 从文本文件中选择未注释的行
我有一个充满代理服务器的文本文件。有些在开头用#注释,不应使用。我已经尝试使用下面的代码来实现这一点,但它仍然在选取注释行。我哪里做错了Php 从文本文件中选择未注释的行,php,file,loops,comments,Php,File,Loops,Comments,我有一个充满代理服务器的文本文件。有些在开头用#注释,不应使用。我已经尝试使用下面的代码来实现这一点,但它仍然在选取注释行。我哪里做错了 function getProxy() { $file = file('proxy.txt',FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); $line = $file[array_rand($file)]; if (strpos($line,'#') !== FALSE) { get
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循环,直到它(随机)选择一个在开始时没有#的代理,而不是每次调用函数并重新加载文件
救命啊 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;
}
事实上,处理这个问题的最佳方法是删除任何被注释的行,然后选择一个随机结果 否则,您可能会遇到非常糟糕的运气,或者文件中有数千条注释行和一两条活动行,并且会等待数小时,让随机性选择一条有效行
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\u filter()
,如下所示:
$file = array_filter($file, function($value){return !(strpos(ltrim($value), "#") === 0);});
你的问题是什么?或者-1,因为您需要做的就是在读取数组后将其洗牌一次,然后再对其进行遍历。它不需要任何max支票。它所需要的一切都是正确的,但另一方面,
shuffle
处理大文件所需的时间要比处理两个array\u rand
所需的时间要长-问题只在于大量的注释行。所以,如果您只需要该数组中的一个条目,您也可以通过array\u filter
运行初始数组,然后运行array\u rand
并确保获得有效条目。这两种解决方案都不是很好。第一个可能以几乎无限的循环运行,第二个可能不返回结果,尽管文件中有一个结果。