6

请有人可以帮助我使用此重复检查功能。当谈到 PHP 时,我还是很新鲜,所以如果这是一个简单的修复,请原谅。

我将电子邮件地址列表存储到一个名为 list.txt 的文件中。这是文件的内容(每个都在一个新行上):

bob@foo.com
sam@bar.com
tracy@foobar.com

现在我有一个功能(不工作)应该检查电子邮件是否已经在列表中:

function is_unique($email) {
   $list = file('list.txt');

   foreach($list as $item){
      if($email == $item){
          return false;
          die(); 
      }
   }
   return true;
}

当我在这个测试中调用函数时,使用现有的电子邮件地址,它仍然返回 true:

if( is_unique('bob@foo.com') ) {
    echo "Email is unique";
} else {
    echo "Duplicate email";
}

// Returns true even though bob@foo.com is in the list

我感谢任何人的意见。

4

6 回答 6

7

可以使用,但是在迭代时list必须trim()使用,因为它们仍然有换行符:itemlist

if($email == trim($item))

更新:正如尼克所提到的,可选标志FILE_IGNORE_NEW_LINES将大大降低执行速度和代码:

function is_unique($email) {
   $list = file('list.txt',FILE_IGNORE_NEW_LINES);
   return in_array($email,$list) ? false : true;  
}
于 2013-04-11T14:50:21.140 回答
2

要么记得修剪你的电子邮件,要么更好的解决方案是FILE_IGNORE_NEW_LINES在你使用文件功能时使用,这将允许你使用 PHP 的内置数组搜索(应该更快)。例如:

function is_unique($email) {
   $list = file('list.txt',FILE_IGNORE_NEW_LINES);

   return !in_array($email,$list);
}
于 2013-04-11T14:56:07.403 回答
0

您可以逐行阅读文件并将该行的内容与您的新电子邮件进行比较。

像这样的东西:

function is_unique($email) 
{
   $file = fopen("list.txt", "r") or exit("Unable to open file!");

   while(!feof($file))
   {
      if($email == $file){
      return false;
      die();
   }
   fclose($file);
}

希望这可以帮助。

于 2013-04-11T14:50:54.000 回答
0

您可以做的是使用 fopen 读取文件并分别读取每一行。然后,您只需检查名称是否已经存在。您也可以打开它,将整个文件放在一个数组中(每行 = 数组行)并抛出一个 array_unique 以过滤掉双精度数。

于 2013-04-11T14:47:03.027 回答
0

列出所有不重复的电子邮件:

$list=array_unique(file('list.txt'));

检查是否存在重复:

$list1=file('list.txt');
$list2=array_unique(file('list.txt'));
count($list1)==count($list2);
于 2013-04-11T14:54:23.513 回答
0

您想在每行文件的末尾注意回车和换行

$fp = fopen('emails.txt', 'r');
while (!feof($fp))
{
   $eml = fgets($fp);
   if(trim($eml, " \n\r") == $email)
   {
      return false;
   }
}
return true;
于 2013-04-11T14:57:04.617 回答