我有一个大型的用户名和电子邮件平面文件,格式如下:
"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>';
}
有什么想法吗?谢谢!
答案 0 :(得分:9)
根据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;
}
答案 1 :(得分:2)
您可以直接使用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()
。
答案 2 :(得分:0)
首先,只需使用file()将文件内容转换为数组:
$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.
}
}
答案 3 :(得分:0)
我认为最简单的解决方案是使用带有str_getcsv()的file()。
代码将是这样的:
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.
}
答案 4 :(得分:0)
虽然fgetcsv可能是一个更优雅的解决方案,但它没有回答你原来的问题:你的第二个数组元素有一个换行符,你正在与一个没有换行符的字符串进行比较。
修复:
if ($string == str_replace('"','', chop($thisarray[1]))) {
答案 5 :(得分:0)
我真的相信其他答案中的所有例子都有效!
但它们都是慢,因为它们都遍历csv文件中的每一行......
我还有另一个例子,如何找到所需的字符串:
$command = sprintf("grep '%s,%s' -Er %s", $userName, $email, $file);
$result = `$command`;
是的,它是某种暗物质,但它确实有效,它确实快速!