txtファイルの各行を新しい配列要素に読み取ります


118

テキストファイルのすべての行を配列に読み込み、各行を新しい要素に入れようとしています。
これまでのところ私のコード。

<?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
何かがそのままコードに配列に格納されていますか?どのような問題がありますか?
Chris Bornhoft、

1
警告:fopenからのFALSEは警告を発行し、ここで無限ループになります。php.net/manual/en/function.feof.php
Gjermund Dahl、

スレッドの日付にもかかわらず、エスケープシーケンスとして解析さ'\n\'せる"\n"には、スレッドを展開する必要はありません。
codekandis

回答:


397

特別な処理が必要ない場合、これはあなたが探していることを行うはずです

$lines = file($filename, FILE_IGNORE_NEW_LINES);

file()かなり遅いよりように思わfile_get_contents+ explodeアレイへ
ロン・

@ロン私は同意します。この場合も、すべてのリクエストでこの方法でファイルを読み取るべきではありません。ソリューションが最適であっても、それはばかげています。ファイルのコンテンツは、メモリキャッシュまたはデータベースに保存する必要があります。PHPでさえ、解析されたファイルのコンテンツを保存します。
つまり

35

私が見つけた最速の方法は:

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

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

$ filenameはファイルのパスと名前になります。../filename.txt。

テキストファイルの設定方法によっては、\ nビットをいじる必要があるかもしれません。


1
「\ n」の代わりに「PHP_EOL」を使用しますが、これはそのように見えます、$ array = explode(PHP_EOL、fread($ fp、filesize($ filename)));
Fabian Harmsen、2016

Drewに感謝します。多くの機能を試した後、機能したのはあなただけです。私の検索キーワードは、\ nではなく<br>です。私のファイルは単一の大きな値の配列としてのみ読み取られていたため、テキスト全体が1つの配列項目$ myarr [0]にすぎなかったため、シャッフルは単一の項目では機能しませんでした。それが誰かを助けることを願っています。再度、感謝します。
2017

27

これを使うだけです:

$array = explode("\n", file_get_contents('file.txt'));

26
$yourArray = file("pathToFile.txt", FILE_IGNORE_NEW_LINES);

FILE_IGNORE_NEW_LINES各配列要素の最後に改行を追加しないようにする空の行をスキップ
することもできFILE_SKIP_EMPTY_LINESます

ここを参照


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

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

fclose($file);

var_dump($members);
?>

1
よろしくお願いします。ただし、配列要素にvaiable =を設定する必要があります。$ var = $ ary [1]; 動作しません。ary [1] = "test"。それが役立つ場合。
ダン

1
自分でカウンターを実行し、配列にインデックスを設定します
Prasad

7
$lines = array();
while (($line = fgets($file)) !== false)
    array_push($lines, $line);

明らかに、最初にファイルハンドルを作成し、それをに保存する必要があります$file


7

それはそのように簡単です:

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

file_get_contents() -ファイル全体を文字列として取得します。

explode("\n")-文字列を区切り文字で分割します"\n"-改行のASCII-LFエスケープとは何ですか。

ただし、注意してください-ファイルにUNIXが含まれていることを確認してください。行末。

場合は"\n"正常に動作しません、あなたはコーディングOF2改行他を持っている、あなたは試すことができ"\r\n""\r"または"\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

順調でしたが、投稿したコードに問題がありました。まず第一に、whileループの閉じ括弧がありませんでした。次に、$ line_of_textはループの繰り返しごとに上書きされます。これは、ループ内で=を。=に変更することで修正されます。3番目に、実際の改行ではなくリテラル文字「\ n」を分解しています。PHPでは、単一引用符はリテラル文字を示しますが、二重引用符は実際にはエスケープされた文字と変数を解釈します。

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

これは、txtファイルを配列として受け入れます。したがって、links.txtファイルに何かを書き込んで(1つの要素に1行を使用)、このページを実行します:)配列は$ fileになります


0

これはここでかなりカバーされていますが、本当にここに記載されているものよりもさらに優れたパフォーマンスが必要な場合は、を使用するこのアプローチを使用できますstrtok

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

これは、ファイルが\n改行文字として保存されていることを前提としています(必要に応じて更新できます)。また、値の代わりに単語/名前/行を配列キーとして保存するため、ファイルをのisset代わりに(はるかに高速)を使用できるルックアップテーブルin_array

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.