在本地文本文件中查找重复项

时间:2013-04-11 14:44:45

标签: php

请有人帮我解决这个重复检查功能。在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

我感谢任何人的意见。

6 个答案:

答案 0 :(得分:7)

可以使用list,但在迭代trim()时,您必须item list,因为他们仍然拥有换行符:

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

更新:提到Nick时,FILE_IGNORE_NEW_LINES的可选标记会大大降低执行速度和代码:

function is_unique($email) {
   $list = file('list.txt',FILE_IGNORE_NEW_LINES);
   return in_array($email,$list) ? false : true;  
}

答案 1 :(得分:2)

要么记得trim您的电子邮件,要么在使用file function时使用FILE_IGNORE_NEW_LINES更好的解决方案,这将允许您使用PHP的内置数组搜索(应该更快)。例如:

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

   return !in_array($email,$list);
}

答案 2 :(得分:0)

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

答案 3 :(得分: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);
}

希望这有帮助。

答案 4 :(得分:0)

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

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

检查是否存在重复项:

$list1=file('list.txt');
$list2=array_unique(file('list.txt'));
count($list1)==count($list2);

答案 5 :(得分:0)

您希望在每行文件末尾注意回车和换行

$fp = fopen('emails.txt', 'r');
while (!feof($fp))
{
   $eml = fgets($fp);
   if(trim($eml, " \n\r") == $email)
   {
      return false;
   }
}
return true;