php strpos пропущенных совпадений в текстовом файле - PullRequest
0 голосов
/ 22 мая 2018

У меня есть фрагмент кода, который ищет в текстовом файле адрес электронной почты, возвращая два числа в одной строке.Файл выглядит так:

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 - возвращал.Чего мне не хватает, что мешает ему поднимать спички?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

На самом деле это довольно легко выяснить.

он находит совпадающие письма только в том случае, если они были введены последними

Это правда.Зачем?Потому что вы всегда устанавливаете $found на false, если только адрес электронной почты, который вы ищете, не является последним.Даже если вы нашли совпадение, вы просто продолжаете цикл и перезаписываете $found с помощью false.

Посмотрите на этот фрагмент и посмотрите, сможете ли вы его вычислитьout.

Вам нужно либо выйти из цикла, либо прекратить установку $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!
    }
}
0 голосов
/ 22 мая 2018

Вы не прекращаете свой цикл, когда находите ответ, то есть он продолжает работать, даже если он нашел совпадение и перезаписывает любое предыдущее совпадение.Добавьте break; после того, как вы присвоили $foundGroup и $foundVideo.

. У вас также есть две оценки, проверяющие одно и то же.Установите флаг $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
    }
}
...