【问题标题】:php strpos missing matches in text filephp strpos在文本文件中缺少匹配项
【发布时间】:2018-05-22 14:29:25
【问题描述】:

我有一段代码在文本文件中搜索电子邮件地址,并在同一行返回两个数字。 该文件如下所示:

24/08/2017,email@test.ie,1,2
21/05/2018,test@234.com,1,2
21/05/2018,test@test.ie,2,2

我的代码目前看起来像

$lines = file("log.txt");
$found = 0;


foreach ($lines as $line){      
    if (strpos($line, $email) !==false){
        $found = true;

        $arrayOfLine = explode(",", $line);

        $foundGroup = $arrayOfLine[2]; 
        $foundVideo = $arrayOfLine[3]; 

    }
    elseif (strpos($line, $email) ===false){
        $found = false;
    }
}

当我通过一个接收要搜索的电子邮件地址的 HTML 表单运行此代码时,它只会找到最后输入的匹配电子邮件 - 在我上面的示例中,test@234.com 不会返回匹配,但 test@test.ie 会。我错过了什么阻止它出现匹配?

【问题讨论】:

  • 不知道你在用$found var做什么,但是:3v4l.org/GittA
  • @Mike 这只是较大代码的一部分,总体目的是创建列表但我不能有重复项,因此此部分搜索匹配项,并显示电子邮件存在在文件中应该找到匹配项。

标签: php strpos


【解决方案1】:

当您找到答案时,您并没有终止循环,这意味着即使找到匹配项并覆盖任何先前的匹配项,它也会继续运行。在分配$foundGroup$foundVideo 之后添加break;

您也有两个评估检查同一件事。在循环开始时将$found 标志设置为false。如果您的循环找不到匹配项,它仍然是错误的。您无需比较两次。

$found = false;

foreach ($lines as $line){      
    if (strpos($line, $email) !==false){
        $found = true;

        $arrayOfLine = explode(",", $line);

        $foundGroup = $arrayOfLine[2]; 
        $foundVideo = $arrayOfLine[3]; 
        break; // stop searching for more matches
    }
}

【讨论】:

    【解决方案2】:

    这其实很容易弄清楚。

    只有最后一次输入的匹配邮件才会找到

    这是真的。为什么?因为您总是将$found 设置为false,除非您要搜索的电子邮件地址是最后一个。即使您找到了匹配项,您也只是继续循环并将$found 覆盖为false

    看看this snippet,看看你能不能弄明白。

    您要么需要跳出循环,要么停止以这种方式设置$found

    foreach ($lines as $line){      
        if (strpos($line, $email) !==false) {
            $found = true;
    
            $arrayOfLine = explode(",", $line);
    
            $foundGroup = $arrayOfLine[2]; 
            $foundVideo = $arrayOfLine[3]; 
    
        }
        elseif (strpos($line, $email) ===false) {
            $found = false; // This will be run every loop!
        }
    }
    

    【讨论】:

    • 此代码即使在找到匹配项后也会继续搜索电子邮件地址,效率低下。
    • 这正是我在回答中所描述的。
    • 不知道你在做什么。您的两个示例都有相同的错误。无论哪种方式,如果您的答案是让 OP “弄清楚”,那么我想您可以将它用于 stackoverflow 上的每个答案。
    • 嗯,也许吧。 OP 的问题是我错过了什么阻止它出现匹配?,这就是我解释的。虽然没有给出有效的代码,但这是真的。
    猜你喜欢
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多