PHP Найти строку в CSV-файле

У меня есть большой плоский файл имен пользователей и писем в следующем формате:

"username", "email" "username", "email" "username", "email" 

и т.д…

Мне нужно взять электронное письмо и найти имя пользователя, но по какой-то причине он не вернет результат. Он работает, если я ищу наоборот.

 $string = "user_email@something.com"; $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>'; } 

Есть идеи? Благодаря!

Согласно предложению reko_t: используйте fgetcsv для чтения отдельных строк csv в массивы, пока не найдете тот, где второй элемент соответствует вашему поисковому запросу. Первый элемент – это имя пользователя. Что-то вроде:

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

Вы можете использовать fgetcsv() напрямую

 $string = "user_email@something.com"; $filename = "user_email.txt"; $h = fopen("$filename","r"); $flag=0; while (!feof ($h)) { list($username, $email= fgetcsv($h); if ($string == $email) { /* do something */ } } 

fgetcsv() (как хороший побочный эффект) также удаляет для вас «полевые оболочки» (двойные кавычки) для вас, если они существуют.

Ваш собственный пример, вероятно, не работает, потому что если у вас есть такая строка

 "username", "email" 

разделение на , приведет к

 '"username"' ' "email"' 

Обратите внимание на пробелы перед "email" , которые вы забыли удалить. Дополнительное использование str_replace() для удаления окружающих котировок довольно небезопасно. Посмотрите на trim() .

Во-первых, просто используйте файл (), чтобы получить содержимое файла в массив:

 $file_contents = file( $filename, 'r' ); 

Теперь прокрутите содержимое массива, разделив строки и исследуя адрес электронной почты:

 foreach ( $file_contents as $line ) { list ( $username, $email ) = str_split( ',' $line ); if ( trim( $email ) == $string ) { // A match was found. Take appropriate action. } } 

Я считаю, что самым простым решением является использование файла () с помощью str_getcsv ().

Код будет примерно таким:

 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. } 

Хотя fgetcsv является потенциально более элегантным решением, это не отвечает на ваш первоначальный вопрос: ваш второй элемент массива имеет новую строку, и вы сравниваете его с строкой, которая этого не делает.

Исправить:

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

Я действительно верю, что все примеры в других ответах работают!
Но все они медленны , потому что все они просматривают каждую строку в файле csv …
У меня есть другой пример, как найти нужную строку:

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

Да, это какая-то темная материя, но она действительно работает, и она очень быстро !