получить содержимое файла с определением пользователя в php?

#php #file

#php #файл

Вопрос:

У меня есть файл dict.txt с его содержимым

 a
aah
aahed
aahing
aahs
b
baa
baaed
baaing
baal
baalism
baalisms
baals
baas
baba
babas
babbitting
babble
babbled
babbler
  

Как я могу прочитать этот файл, начинающийся только с a или другого.
Я знаю, что функция file_get_contents получит содержимое строки в файле,

 function getStartWith($letter){
    $allListStartWithWord = array();
    $source = __SITE_PATH."/tmp/wordsEn.txt";
    $content = file_get_contents($source );
    $all_list = explode('n', $content ); // it is big one 
    fclose($fh);
   return $allListStartWithWord;    

}
  

кто-нибудь мог бы рассказать мне, как сделать это с большим файлом, что-то вроде All English Word.

Ответ №1:

 $fp = fopen(__SITE_PATH."/tmp/wordsEn.txt", 'rb');
while (!feof($fp)) {
  $line = fgets($fp);
}
fclose($fp);
  

Читает файл построчно

Ответ №2:

Вы не можете читать строку и проверять, начинается ли она с a , я вижу два решения, которые немного ускорят процесс:

  • Если вы знаете, что слова отсортированы, вы можете остановиться, когда найдете строку, начинающуюся с b
  • Напишите скрипт для разделения вашего файла на файлы с конкретными буквами dict-a, dict-b… таким образом, вам нужно будет только прочитать dict-$letter.

Ответ №3:

Вам нужно:

a. прочитайте файл построчно, пока не найдете символ

 $foundO = false;
while($s=fgets($fh)){
  if(!$foundO amp;amp; $s[0]!='o') continue; // before O
  if($foundO amp;amp; $s[0]!='o') break; // after O
  // good line
}
  

или

б. создайте индексный файл, содержащий позиции для начальных символов, и используйте fseek

 $index = file('index.txt');
$pos = $index[ord('O'-65); // 65 is ord('A');
fseek($fh, $pos);
  

Ответ №4:

Взгляните на SplFileObject он поддерживает построчное чтение файла с помощью простого foreach :

 $file = new SplFileObject($path);
foreach ($file as $line)
{
     ...
}
  

Поскольку он предлагает итерацию по всем строкам, вы также можете отфильтровать его напрямую, например, получить все строки, начинающиеся с a , и удалить разрывы строк:

 $file = new SplFileObject($path);
$file->setFlags(SplFileObject::DROP_NEW_LINE);
  

Теперь, если вы хотите отфильтровать строки, вы можете просто добавить фильтр:

 $linesStartingWithA = new RegexIterator($file, '/^a/');
  

Если вы теперь используете foreach в новой переменной, вы получите все строки, начинающиеся с a :

 foreach ($linesStartingWithA as $line)
{
     ...
}
  

Простой пример с SplTempFileObject объектом для демонстрации этого (здесь используется временный файл, потому что тогда ему не нужен физический файл на диске, это определенный тип SplFileObject ).

Пример (демо):

 // for the example, a SplFileObject of SplTempFileObject is used.
$file = new SplTempFileObject();
$file->setFlags(SplFileObject::DROP_NEW_LINE);
$file->fwrite('a
aah
aahed
aahing
aahs
b
baa
baaed
baaing
baal
baalism
baalisms
baals
baas
baba
babas
babbitting
babble
babbled
babbler');

$linesStartingWithA = new RegexIterator($file, '/^a/');

foreach ($linesStartingWithA as $line => $string)
{
    printf("#%d: %sn", $line, $string);
}
  

Вывод:

 #0: a
#1: aah
#2: aahed
#3: aahing
#4: aahs