Поиск в массиве частичного (или точного) совпадения

У меня есть код, который берет из текстового файла список электронных писем и вставляет их в базу данных, стараясь не добавлять электронное письмо, если оно уже находится в указанной базе данных. Сейчас я пытаюсь фильтровать электронные письма по мере их чтения из txt-файла и НЕ вставлять их, если они точно или частично совпадают с какими-либо строками в массиве $filter. Другими словами, если в адресе электронной почты есть «gmail», «.ru» или «exec», я не хочу, чтобы они добавлялись.

Любая помощь, чтобы остановить кровотечение из-за того, что я бьюсь головой о стену, была бы здоровой!

Код:

$TheFile = "emails.txt";

$handle = fopen($TheFile, 'r');

$good_count = 0;
$bad_count = 0;

$filter= array("gmail",".ru","exec");

while (!feof($handle))
{
    $Data = fgets($handle, 1024);
    $output = explode (",",$Data);

    $exist = mysql_query("SELECT * FROM table WHERE email='$output[0]'");

    if (mysql_num_rows ($exist) == 0) {
        $email = strtolower($output[0]);
        $sql = "INSERT INTO table SET email='$email'";
        mysql_query($sql);
        $good_count = $good_count + 1;
    }
    else {
        $bad_count = $bad_count + 1;
    }
}

person 86Stang    schedule 08.08.2011    source источник
comment
comment
Также учтите, что вы можете использовать INSERT IGNORE или INSERT REPLACE, где повторяются значения пропускаются или перезаписываются.   -  person JYelton    schedule 09.08.2011
comment
Спасибо, но это не совсем то, что мне нужно. Я уже чищу от дубликатов (может быть, не самый эффективный способ). Мне нужно сопоставить каждую запись с массивом $filter и не вставлять их, если есть совпадение.   -  person 86Stang    schedule 09.08.2011
comment
php.net/manual/en/function.in-array.php   -  person vascowhite    schedule 09.08.2011


Ответы (1)


Используйте stripos в функции проверки:

function validate_email($input, array $needles) {
    foreach ($needles as $needle) {
        if (stripos($input, $needle) === false) return false;
    }
    return true;
}

// ...

if (mysql_num_rows ($exist) == 0 &&
    validate_email($output[0], $filter)) 
{
    $email = strtolower($output[0]);
    $sql = "INSERT INTO table SET email='$email'";
    mysql_query($sql);
    $good_count = $good_count + 1;
}
else {
    $bad_count = $bad_count + 1;
}

Кроме того, рассмотрите возможность использования UNIQUE index в определении таблицы. . Это вызовет (уловимую) ошибку MySQL, если электронное письмо уже существует, и разгрузит ваш скрипт от выполнения запроса SELECT для каждого электронного письма в вашем файле.

person netcoder    schedule 08.08.2011
comment
Извините за нубский удар по логике вашего ответа, но я действительно хочу кое-что узнать из этого, а не просто скопировать/вставить ответ... В вашей функции, если есть хотя бы одно совпадение, она вернет false и завершит функцию, иначе он вернет true, правильно? Предполагая, что это правильно, оператор IF с функцией говорит, что если электронная почта не существует, а функция возвращает false, выполните фигурные скобки. Это близко? - person 86Stang; 09.08.2011
comment
@ 86Stang: функция должна возвращать true (т. Е. Ни один из $needles не найден в $input) для выполнения оператора if (фигурные скобки). Кстати, не расстраивайтесь из-за нубизма :) Мы все проходили через это в какой-то момент. Я предпочитаю, чтобы вы чему-то научились, а не просто копировали/вставляли! Черт, если вы чему-то научитесь, то сможете сами отвечать на вопросы в StackOverflow. :D - person netcoder; 09.08.2011