У меня есть большой плоский файл имен пользователей и писем в следующем формате:
"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`;
Да, это какая-то темная материя, но она действительно работает, и она очень быстро !