您可以使用SplFileObject http://de3.php.net/manual/en/class.splfileobject.php并逐行迭代文件。
请注意,迭代文件的内存效率比使用file()
or file_get_contents()
因为它不会将整个文件内容读取到数组或变量中。
$username = 'AULLAH1';
$file = new SplFileObject("data.csv");
$grabbed = FALSE;
while (!$file->eof()) {
$data = $file->fgetcsv(' ');
if($data[0] === $username) {
$grabbed = $file->current();
}
}
echo $grabbed;
Because fgetcsv()
解析行时考虑了分隔符、包围符和转义字符,但速度并不快。如果您必须以这种方式解析数百行或数千行,请确保您确实需要它。
另一种方法是检查当前行是否在某处包含用户名字符串。在您在问题中显示的文件格式中,这是可行的,因为其余字段包含数字,因此不会出现任何误报:
$username = 'AULLAH1';
$file = new SplFileObject("data.txt");
$grabbed = FALSE;
foreach($file as $line) {
if(strpos($line, $username) !== FALSE) {
$grabbed = $line;
}
}
echo $grabbed;
如果您想确保在位置 1 找到 $username,请更改if
测试条件=== 1
.
如果由于某种原因,您想要拥有用户名出现的所有行,您可以编写一个自定义过滤器迭代器来迭代文件内容,例如
class UsernameFilter extends FilterIterator
{
protected $_username;
public function __construct(Iterator $iterator, $username)
{
$this->_username = $username;
parent::__construct($iterator);
}
public function accept()
{
return strpos($this->current(), $this->_username) !== FALSE;
}
}
然后你可以简单地使用foreach
。 FilterIterator 将把每一行传递给accept()
并且只有那些返回 TRUE 的行才被实际使用。
$filteredLines = new UsernameFilter(new SplFileObject('data.txt'), 'AULLAH1');
foreach($filteredLines as $line) {
echo $line;
}
上面将输出
"AULLAH1" "01/07/2010 15:28 " "55621454" "123456" "123456.00"
"AULLAH1" "07/07/2010 15:05 " "55621454" "189450" "123456.00"
如果你想把这些行放在一个数组中,你可以这样做
$lines = iterator_to_array($filteredLines);
并查看最后一项
echo end($lines);