Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从文本文件中选择未注释的行_Php_File_Loops_Comments - Fatal编程技术网

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
并确保获得有效条目。这两种解决方案都不是很好。第一个可能以几乎无限的循环运行,第二个可能不返回结果,尽管文件中有一个结果。