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);

?>

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);

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.


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'));

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


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

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

fclose($file);

var_dump($members);
?>

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.


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"


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);

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);
    ?>

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


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.