Вы можете использовать SplFileObject
и перебирать файл строка за строкой.
Обратите внимание, что итерация по файлу намного более эффективна по сравнению с использованием file()
или 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;
Поскольку fgetcsv()
учитывает разделители, вложения и escape-символы при разборе строки, это не совсем быстро, хотя. Если вам нужно проанализировать пару сотен или тысяч строк таким образом, убедитесь, что вы действительно нуждаетесь в этом.
Альтернативой было бы просто проверить, содержит ли текущая строка где-нибудь строку имени пользователя. В формате файла, который вы показываете в вопросе, это будет возможно, потому что остальные поля содержат цифры, поэтому не может быть никаких ложных срабатываний:
$username = 'AULLAH1';
$file = new SplFileObject("data.txt");
$grabbed = FALSE;
foreach($file as $line) {
if(strpos($line, $username) !== FALSE) {
$grabbed = $line;
}
}
echo $grabbed;
Если вы хотите убедиться, что $ username был найден в позиции 1, измените условие if
, чтобы проверить === 1
.
Если по какой-то причине вы хотите иметь все строки, где встречается имя пользователя, вы можете написать собственный FilterIterator для итерации по содержимому файла, например,
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);