【问题标题】:Searching array for partial (or exact) match [duplicate]搜索部分(或完全)匹配的数组[重复]
【发布时间】:2011-10-22 18:05:22
【问题描述】:

我有一些代码从 txt 文件中获取电子邮件列表并将它们插入数据库,如果电子邮件已经在所述数据库中,请确保不要添加电子邮件。我现在要做的是过滤从 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;
    }
}

【问题讨论】:

标签: php arrays match


【解决方案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 查询。

【讨论】:

  • 请原谅菜鸟刺伤你的答案的逻辑,但我真的想从中学到一些东西,而不仅仅是复制/粘贴答案......在你的函数中,如果有一个匹配,它会返回false并结束函数,否则返回true,对吗?假设这是正确的,带有函数的 IF 语句是说“如果电子邮件不存在并且函数返回 false,则执行花括号”。接近了吗?
  • @86Stang:该函数必须返回 true(即:在 $input 中找不到任何 $needles)才能执行 if 语句(大括号)。顺便说一句,不要对“noobiness”感到难过:)我们都曾在某个时候经历过。我更喜欢你学习一些东西,而不仅仅是复制/粘贴!地狱,如果你学到了一些东西,你将能够自己回答 StackOverflow 上的问题。 :D
猜你喜欢
  • 2014-09-07
  • 2017-05-08
  • 1970-01-01
  • 2018-02-17
  • 2019-09-22
  • 1970-01-01
  • 2019-09-27
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多