php strpos 在文本文件中缺少匹配项

php strpos missing matches in text file

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

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 不会 return 匹配,但 test@test.ie 会。我错过了什么阻止它出现比赛?

找到答案后并没有终止循环,这意味着它会继续 运行,即使找到匹配项并覆盖之前的任何匹配项也是如此。在分配 $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
    }
}

这其实很容易理解。

it only finds matching emails if they were the last entered

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

覆盖 $found

看看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!
    }
}