Lire chaque ligne du fichier txt dans un nouvel élément de tableau

118

J'essaie de lire chaque ligne d'un fichier texte dans un tableau et d'avoir chaque ligne dans un nouvel élément.
Mon code jusqu'à présent.

<?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
la source
1
Quelque chose est-il stocké dans le tableau avec votre code tel quel? Quel problème spécifique rencontrez-vous?
Chris Bornhoft
1
Avertissement: FALSE de fopen émettra un avertissement et entraînera une boucle infinie ici. php.net/manual/en/function.feof.php
Gjermund Dahl
Malgré la date du thread, un '\n\'ne sera pas explosé alors qu'il doit être un "\n"pour qu'il soit analysé comme une séquence d'échappement.
codekandis

Réponses:

396

Si vous n'avez besoin d'aucun traitement spécial, cela devrait faire ce que vous recherchez

$lines = file($filename, FILE_IGNORE_NEW_LINES);
Yanick Rochon
la source
file()semble être considérablement plus lent que file_get_contents+ explodeà tableau
Ron
@Ron Je suis d'accord. Là encore, vous ne devriez pas lire un fichier de cette façon à chaque demande. C'est juste idiot, même si la solution est optimale. Le contenu du fichier doit être stocké dans le cache mémoire ou même dans une base de données. Même PHP stocke le contenu des fichiers analysés. Je veux dire, nous sommes loin de PHP 4.3
Yanick Rochon
35

Le moyen le plus rapide que j'ai trouvé est:

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

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

où $ filename va être le chemin et le nom de votre fichier, par exemple. ../filename.txt.

Selon la façon dont vous avez configuré votre fichier texte, vous devrez peut-être jouer avec le \ n bit.

Drew Dello Stritto
la source
1
J'utiliserais "PHP_EOL" au lieu de "\ n", cela semble ainsi, $ array = exploser (PHP_EOL, fread ($ fp, filesize ($ filename)));
Fabian Harmsen
Merci Drew, après avoir essayé de nombreuses fonctions, la vôtre est la seule qui a fonctionné. Mon terme de recherche est <br> au lieu de votre \ n. Mon fichier était lu comme un seul tableau de grande valeur, le texte entier n'était qu'un élément du tableau $ myarr [0], donc la lecture aléatoire ne fonctionnait pas sur un seul élément. J'espère que ça aide quelqu'un. Merci encore.
washere
27

Utilisez simplement ceci:

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

FILE_IGNORE_NEW_LINESéviter d'ajouter une nouvelle ligne à la fin de chaque élément du tableau
Vous pouvez également utiliser FILE_SKIP_EMPTY_LINESpour sauter les lignes vides

référence ici

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

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

fclose($file);

var_dump($members);
?>
Gaurav
la source
1
D'accord, je le fais fonctionner parfaitement merci. Cependant, je dois définir un vaiable = sur un élément de tableau. $ var = $ ary [1]; ne marche pas. ary [1] = "test". Si cela aide.
Dan
1
Exécutez un compteur vous-même et définissez l'index dans le tableau
Prasad
7
$lines = array();
while (($line = fgets($file)) !== false)
    array_push($lines, $line);

De toute évidence, vous devrez d'abord créer un descripteur de fichier et le stocker $file.

Rafe Kettler
la source
7

C'est aussi simple que ça:

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

file_get_contents() - obtient le fichier entier sous forme de chaîne.

explode("\n")- divisera la chaîne avec le délimiteur "\n"- qu'est-ce qu'un échappement ASCII-LF pour une nouvelle ligne.

Mais faites attention - vérifiez que le fichier a une terminaison UNIX -Line.

si "\n"cela ne fonctionne pas correctement, vous avez un autre codage de 2 newline et vous pouvez essayer "\r\n", "\r"ou"\025"

CodeBrauer
la source
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
la source
1

Vous étiez sur la bonne voie, mais il y a eu des problèmes avec le code que vous avez publié. Tout d'abord, il n'y avait pas de parenthèse fermante pour la boucle while. Deuxièmement, $ line_of_text serait écrasé à chaque itération de boucle, ce qui est corrigé en changeant le = en a. = Dans la boucle. Troisièmement, vous faites exploser les caractères littéraux '\ n' et non une nouvelle ligne réelle; en PHP, les guillemets simples indiqueront des caractères littéraux, mais les guillemets doubles interpréteront en fait les caractères et les variables échappés.

    <?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
la source
1
    $file = file("links.txt");
print_r($file);

Cela acceptera le fichier txt comme tableau. Alors écrivez quelque chose dans le fichier links.txt (utilisez une ligne pour un élément) après, exécutez cette page :) votre tableau sera $ file

altaïevrim
la source
0

Cela a été assez bien couvert ici, mais si vous avez VRAIMENT besoin de performances encore meilleures que tout ce qui est répertorié ici, vous pouvez utiliser cette approche qui utilise strtok.

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

Notez que cela suppose que votre fichier est enregistré avec \ncomme caractère de nouvelle ligne (vous pouvez le mettre à jour au besoin), et qu'il stocke également les mots / noms / lignes comme clés de tableau au lieu des valeurs, afin que vous puissiez l'utiliser comme un table de recherche, permettant l'utilisation de isset(beaucoup, beaucoup plus rapide), au lieu de in_array.

Brian Leishman
la source