2013-04-11 40 views
6

xin vui lòng ai đó có thể giúp tôi với chức năng kiểm tra trùng lặp này. Tôi vẫn còn khá tươi khi nói đến PHP, vì vậy xin vui lòng tha thứ cho tôi, nếu đây là một sửa chữa đơn giản.Tìm kiếm bản sao trong tệp văn bản cục bộ

Tôi đang lưu trữ danh sách địa chỉ email vào tệp có tên list.txt. Dưới đây là nội dung của tập tin (mỗi trên một dòng mới):

[email protected].com 
[email protected] 
[email protected] 

Bây giờ tôi có một chức năng (không hoạt động) mà nên kiểm tra xem email là đã có trong danh sách:

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

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

Khi Tôi gọi hàm này trong thử nghiệm này, với địa chỉ email hiện tại, nó vẫn trả về true:

if(is_unique('[email protected]')) { 
    echo "Email is unique"; 
} else { 
    echo "Duplicate email"; 
} 

// Returns true even though [email protected] is in the list 

Tôi đánh giá cao ý kiến ​​của bất kỳ ai.

Trả lời

7

Nó là tốt để sử dụng list nhưng bạn phải trim() các item khi iterating qua list như họ vẫn có linebreak:

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

Cập nhật: Như Nick đề cập, cờ tùy chọn của FILE_IGNORE_NEW_LINES sẽ đột ngột cắt giảm tốc độ và mã thực thi:

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

này cố định nó. Quên về các ngắt dòng. Cám ơn rất nhiều về sự giúp đỡ của bạn. – Saladon

+2

Sử dụng cờ 'FILE_IGNORE_NEW_LINES' khi bạn sử dụng chức năng tệp sẽ là giải pháp tốt hơn là cắt nó theo cách thủ công sau đó – Nick

+0

@Nick - Đó là một điểm tuyệt vời, tôi đã thêm ví dụ và ném liên kết tới bạn, hy vọng đó là alright. –

0

Những gì bạn có thể làm là đọc tập tin-sử dụng fopen- và đọc từng dòng riêng biệt. Sau đó, bạn chỉ cần kiểm tra xem tên đã có trong đó chưa. Bạn cũng có thể mở nó, đặt toàn bộ tập tin trong một mảng (mỗi dòng = hàng mảng) và ném qua một mảng_unique để lọc ra đôi.

0

Bạn có thể đọc t anh ấy xếp hàng từng dòng và so sánh nội dung của dòng đó với email mới của bạn.

Something như thế này:

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); 
} 

Hope this helps.

0

cho danh sách tất cả các email không trùng lặp:

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

để kiểm tra nếu bản sao tồn tại:

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

Hoặc nhớ trim email của bạn, hoặc một giải pháp tốt hơn là nên sử dụng FILE_IGNORE_NEW_LINES khi bạn sử dụng file function, cho phép bạn sử dụng tìm kiếm mảng sẵn có của PHP (nên nhanh hơn). Ví dụ:

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

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

Bạn muốn tìm cho ra xe trở lại và ăn dòng ở cuối mỗi dòng của file

$fp = fopen('emails.txt', 'r'); 
while (!feof($fp)) 
{ 
    $eml = fgets($fp); 
    if(trim($eml, " \n\r") == $email) 
    { 
     return false; 
    } 
} 
return true; 
Các vấn đề liên quan