Leia cada linha do arquivo txt para um novo elemento da matriz

118

Estou tentando ler cada linha de um arquivo de texto em uma matriz e ter cada linha em um novo elemento.
Meu código até agora.

<?php
$file = fopen("members.txt", "r");
$i = 0;
while (!feof($file)) {

$line_of_text = fgets($file);
$members = explode('\n', $line_of_text);
fclose($file);

?>
Dan
fonte
1
Há alguma coisa armazenada na matriz com seu código como está? Que problema específico você está tendo?
Chris Bornhoft
1
Aviso: FALSE de fopen irá emitir um aviso e resultar em loop infinito aqui. php.net/manual/en/function.feof.php
Gjermund Dahl
Apesar da data do thread, um '\n\'não será explodido, mas deve ser um "\n"para que seja analisado como uma sequência de escape.
codekandis de

Respostas:

397

Se você não precisa de nenhum processamento especial, isso deve fazer o que você procura

$lines = file($filename, FILE_IGNORE_NEW_LINES);
Yanick Rochon
fonte
file()parece ser consideravelmente mais lento do que file_get_contents+ explodepara array
Ron
@Ron eu concordo. Então, novamente, você não deve ler um arquivo dessa maneira a cada solicitação. Isso é bobagem, mesmo que a solução seja ótima. O conteúdo do arquivo deve ser armazenado no cache de memória ou mesmo em um banco de dados. Até mesmo o PHP armazena o conteúdo dos arquivos analisados. Quer dizer, estamos longe de PHP 4.3
Yanick Rochon
35

A maneira mais rápida que encontrei é:

// Open the file
$fp = @fopen($filename, 'r'); 

// Add each line to an array
if ($fp) {
   $array = explode("\n", fread($fp, filesize($filename)));
}

onde $ filename vai ser o caminho e nome do seu arquivo, por exemplo. ../filename.txt.

Dependendo de como você configurou seu arquivo de texto, talvez seja necessário brincar com a parte \ n.

Drew Dello Stritto
fonte
1
Eu usaria "PHP_EOL" em vez de "\ n", isso parece, $ array = explode (PHP_EOL, fread ($ fp, filesize ($ filename)));
Fabian Harmsen
Obrigado Drew, depois de tentar várias funções, a sua é a única que funcionou. Meu termo de pesquisa sendo <br> em vez de seu \ n. Meu arquivo estava sendo lido como apenas uma única matriz de grande valor, o texto inteiro era apenas um item da matriz $ myarr [0], então embaralhar não funcionou em um único item. Espero que ajude alguém. Obrigado novamente.
estava aqui em
27

Basta usar isto:

$array = explode("\n", file_get_contents('file.txt'));
RoLife
fonte
26
$yourArray = file("pathToFile.txt", FILE_IGNORE_NEW_LINES);

FILE_IGNORE_NEW_LINESevite adicionar uma nova linha no final de cada elemento da matriz
Você também pode usar FILE_SKIP_EMPTY_LINESpara Pular as linhas vazias

referência aqui

iianfumenchu
fonte
23
<?php
$file = fopen("members.txt", "r");
$members = array();

while (!feof($file)) {
   $members[] = fgets($file);
}

fclose($file);

var_dump($members);
?>
Gaurav
fonte
1
Ok, estou funcionando perfeitamente, obrigado. No entanto, preciso definir um vaiable = para um elemento de matriz. $ var = $ ary [1]; não funciona. ary [1] = "teste". Se isso ajudar.
Dan
1
Execute um contador você mesmo e defina o índice na matriz
Prasad
7
$lines = array();
while (($line = fgets($file)) !== false)
    array_push($lines, $line);

Obviamente, você precisará primeiro criar um identificador de arquivo e armazená-lo $file.

Rafe Kettler
fonte
7

É tão fácil assim:

$lines = explode("\n", file_get_contents('foo.txt'));

file_get_contents() - obtém o arquivo inteiro como string.

explode("\n")- dividirá a string com o delimitador "\n"- o que é escape ASCII-LF para uma nova linha.

Mas preste atenção - verifique se o arquivo tem terminações UNIX -Line.

se "\n"não funcionar corretamente, você tem outra codificação de 2 novas linhas e pode tentar "\r\n", "\r"ou"\025"

CodeBrauer
fonte
3
$file = __DIR__."/file1.txt";
$f = fopen($file, "r");
$array1 = array();

while ( $line = fgets($f, 1000) )
{
    $nl = mb_strtolower($line,'UTF-8');
    $array1[] = $nl;
}

print_r($array);
Attila Nagy
fonte
1

Você estava no caminho certo, mas houve alguns problemas com o código postado. Em primeiro lugar, não havia colchete de fechamento para o loop while. Em segundo lugar, $ line_of_text seria sobrescrito com cada iteração do loop, o que é corrigido alterando = para a. = No loop. Terceiro, você está explodindo os caracteres literais '\ n' e não uma nova linha real; no PHP, as aspas simples denotam caracteres literais, mas as aspas duplas na verdade interpretam variáveis ​​e caracteres de escape.

    <?php
        $file = fopen("members.txt", "r");
        $i = 0;
        while (!feof($file)) {
            $line_of_text .= fgets($file);
        }
        $members = explode("\n", $line_of_text);
        fclose($file);
        print_r($members);
    ?>
Nick Andren
fonte
1
    $file = file("links.txt");
print_r($file);

Isso aceitará o arquivo txt como array. Então escreva qualquer coisa no arquivo links.txt (use uma linha para um elemento) depois, execute esta página :) seu array será $ file

Altayevrim
fonte
0

Isso foi coberto aqui muito bem, mas se você REALMENTE precisar de um desempenho ainda melhor do que qualquer coisa listada aqui, você pode usar esta abordagem que usa strtok.

$Names_Keys = [];
$Name = strtok(file_get_contents($file), "\n");
while ($Name !== false) {
    $Names_Keys[$Name] = 0;
    $Name = strtok("\n");
}

Observe, isso assume que seu arquivo é salvo com \no caractere de nova linha (você pode atualizá-lo conforme necessário), e também armazena as palavras / nomes / linhas como as chaves de array em vez dos valores, para que você possa usá-lo como um tabela de pesquisa, permitindo o uso de isset(muito, muito mais rápido), em vez de in_array.

Brian Leishman
fonte