2013-04-11 21 views
6

per favore qualcuno potrebbe aiutarmi con questa funzione di controllo duplicato. Sono ancora abbastanza fresco quando si tratta di PHP, quindi per favore scusami, se questa è una soluzione semplice.Cerca duplicato nel file di testo locale

Sto memorizzando un elenco di indirizzi e-mail in un file chiamato list.txt. Ecco il contenuto del file (ciascuno su una nuova linea):

[email protected] 
[email protected] 
[email protected] 

ora ho una funzione (non funzionante) che dovrebbe controllare se la posta elettronica è già nella lista:

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

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

Quando Chiamo la funzione in questo test, con un indirizzo email esistente, restituisce ancora true:

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

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

Apprezzo l'input di chiunque.

risposta

7

E 'bene usare list ma è necessario trim() il item quando iterazione attraverso il list come hanno ancora l'interruzione di riga:

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

Aggiornamento: Come Nick accennato, la bandiera facoltativa di FILE_IGNORE_NEW_LINES drammaticamente ridurre la velocità di esecuzione e il codice:

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

Questo riparato. Hai dimenticato le interruzioni di riga. Grazie mille per il vostro aiuto. – Saladon

+2

Utilizzare il flag 'FILE_IGNORE_NEW_LINES' quando si utilizza la funzione di file sarebbe una soluzione migliore rispetto a doverlo ritagliare manualmente dopo quello – Nick

+0

@Nick - Questo è un grande punto, ho aggiunto l'esempio e vi ho inserito un link, spero che vada tutto bene –

0

Quello che puoi fare è leggere il file -utilizzando fopen- e leggere ogni riga separatamente. Quindi devi semplicemente controllare se il nome è già lì. Puoi anche aprirlo, mettere l'intero file in un array (ogni riga = riga di array) e gettare su un array_unique per filtrare i doppi.

0

È possibile leggere t file riga per riga e confronta il contenuto di quella linea con la tua nuova email.

Qualcosa di simile a questo:

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

Spero che questo aiuti.

0

per la lista di tutti i messaggi di posta elettronica non duplicati:

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

per controllo se i duplicati esiste:

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

In entrambi ricordati di trim tua e-mail o una soluzione migliore sarebbe quella di utilizzare FILE_IGNORE_NEW_LINES mentre usi lo file function, che ti permetterebbe di usare la ricerca di un array integrato di PHP (dovrebbe essere più veloce). Per esempio:

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

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

Si desidera guardare fuori per ritorno a capo e avanzamento riga alla fine di ogni riga del file

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