PHP でクールに txt ファイルを扱う方法を考える

Dec 1st, 2022 php

※ php7.3.6 で検証.

状況

以下の処理を実行したい.

書き込み

今回は,配列を json_encode して書き込んでみる.

$arraydata/data.txt に書き込む.

- fopen() して fwrite() する方法

一番一般的(?)な方法.php でファイルを開き,書き込みを行う.流れは以下.

<?php
$array = [
  'text' => 'hoge',
  'date' => '2019-10-02',
];

$file = fopen('data/data.txt', 'a+');
flock($file, LOCK_EX);
fwrite($file, json_encode($array) . "\n");
flock($file, LOCK_UN);
fclose($file);

流れがとてもわかりやすいと思う.ただ,コードがちょっと長いか.

参考

- file_put_contents() する方法

file_put_contents() を使用すると一発で書き込みができる.

<?php
$array = [
  'text' => 'hoge',
  'date' => '2019-10-02',
];

file_put_contents('data/data.txt', json_encode($array) . "\n", FILE_APPEND | LOCK_EX);

書き込み先のファイル名,書き込むデータ,書き込みの形式を指定するだけで書き込みが実行できる.

第3引数の FILE_APPEND | LOCK_EX はそれぞれ

を表している.上記を指定することで,fopen()fwrite() を使用した方法と同じ挙動となる.

引数がわかりやすい上に記述も短い.こちらを利用するほうが良さそう.

ただし,第 3 引数の挙動は fopen()fwrite() を理解していないとわかりにくい.

参考

読み込み

書き込みで作成したデータ(data/data.txt)を読み込み,json 形式にして echo する.

- fopen() して fgets() する方法

(多分)一般的な方法.流れもわかりやすい.

<?php
$result_array = [];

if (file_exists('data/data.txt')) {
  $file = fopen('data/data.txt', 'r');
  flock($file, LOCK_EX);
  if ($file) {
    while ($line = fgets($file)) {
      $result_array[] = json_decode($line);
    }
  }
  flock($file, LOCK_UN);
  fclose($file);
  echo json_encode($result_array);
} else {
  echo json_encode([]);
}

流れはとてもわかりやすいが,コードが長いか.while を用いた記述が冗長な気もする.

参考

- file() 関数を用いる方法

file() 関数を使用すると,txt ファイルの1行を要素として配列にまとめることができる.

<?php
if (file_exists('data/data.txt')) {
  $result_array = file('data/data.txt', FILE_IGNORE_NEW_LINES);
  echo json_encode(array_map(function ($str) {
    return json_decode($str);
  }, $result_array));
} else {
  echo json_encode([]);
}

配列に入れればなんとかなるので,file() 関数が便利.

参考

まとめ

good luck ( `・ω・)b