2011-06-21 18 views
7

aşağıdaki biçimde kullanıcı adı ve e-postaların büyük bir düz dosyası var file kullanıcı adı, ancak bir sebepten dolayı sonuç döndürmez. Tersini ararsam işe yarıyor.PHP Bul Dize

$string = "[email protected]"; 
$filename = "user_email.txt"; 
     $h = fopen("$filename","r"); 
     $flag=0; 

     while (!feof ($h)) { 
      $buffer = fgets($h); 
      $thisarray = split(",", $buffer); 

      if ($string == str_replace('"','', $thisarray[1])) { 
       $i = 1; 
       $i++; 
       echo '<td bgcolor="#CCFFCC"><b style="color: maroon">' . str_replace('"','',$thisarray[0]). '</b></td>'; 

       } 

Herhangi bir fikir? Teşekkürler!

+0

Bir dosya tanıtıcısından CSV satırını okumak için 'fgetcsv' komutunu kullanabilirsiniz: http://php.net/fgetcsv –

+0

[PHP Read CSV'nin olası kopyası ve tarihe göre filtrele] (http://stackoverflow.com/questions/2127775/php-read-csv-ve-filter-by-date # 2128053) – Gordon

cevap

6

. İlk eleman, kullanıcı adıdır. gibi bir şey:

<?php 
function find_user($filename, $email) { 
    $f = fopen($filename, "r"); 
    $result = false; 
    while ($row = fgetcsv($f)) { 
     if ($row[1] == $email) { 
      $result = $row[0]; 
      break; 
     } 
    } 
    fclose($f); 
    return $result; 
} 
+0

mükemmel çalıştı! teşekkürler :) –

+0

teşekkürler benim için uygun iş ... – pratik

1

Onların varsa da, sizin için "saha muhafazaları" (çift tırnak ") kaldırır (güzel yan etki gibi) doğrudan

$string = "[email protected]"; 
$filename = "user_email.txt"; 
$h = fopen("$filename","r"); 
$flag=0; 

while (!feof ($h)) { 
    list($username, $email= fgetcsv($h); 

    if ($string == $email) { /* do something */ } 
} 

fgetcsv()fgetcsv() kullanabilir. Eğer böyle bir çizgi varsa

"username", "email" 

, de bölme "email" önce

'"username"' 
' "email"' 

Uyarısı'nda boşluk neden olur çünkü

Kendi örnek muhtemelen kaldırmak unuttuğunu, çalışmıyor . Çevreleyen tırnakları kaldırmak için str_replace() kullanarak ek oldukça güvenli değildir. trim()'a bir göz atın.

+0

Ayrıca, yalnızca e-posta bulunana kadar gitmeniz gerekiyorsa ve sonra durdurun, bir mola ekleyin; if ifadesinin sonuna açıklama. – Joseph

0

Birincisi, sadece bir diziye dosyasının içeriğini almak için dosya() kullanın:

$file_contents = file($filename, 'r'); 
dizinin içeriğinin, e-posta adresini dizeleri bölme ve incelenmesi yoluyla

Şimdi döngü:

Kullanım fgetcsv ikinci unsur arama terimini maçları bulana kadar, diziler içine csv bireysel satırları okumak için: reko_t önerisi gereğince
foreach ($file_contents as $line) { 
    list ($username, $email) = str_split(',' $line); 
    if (trim($email) == $string) { 
     // A match was found. Take appropriate action. 
    } 
} 
0

Ben kolay çözüm() str_getcsv dosyayı() kullanmak olduğunu düşünüyorum.

kod böyle bir şey olurdu:

foreach (file($fileName, FILE_SKIP_EMPTY_LINES) as $line) { 
    $columns = str_getcsv($line); // Where $columns[0] and $columns[1] hold the username and email respectively. 
} 
0

fgetcsv orijinal soruya cevap vermeyen bir daha zarif bir çözüm, potansiyel iken: ikinci dizi elemanı Yeni satır vardır ve karşılaştırmakta olduğunuz olmayan bir dizgeye karşı.

düzeltmek için:

if ($string == str_replace('"','', chop($thisarray[1]))) { 
0

Gerçekten diğer yanıtlar örnekleridir çalışır inanıyoruz! hepsi csv dosyasındaki her satır travers çünkü
Ama bütün bunlar, yavaş vardır ...
nasıl arzu dize bulmak için başka bir örnek vardır:

$command = sprintf("grep '%s,%s' -Er %s", $userName, $email, $file); 
$result = `$command`; 

Evet o karanlık madde bir çeşit, ama gerçekten çalışıyor ve gerçekten hızlı!