PHP

PHPで連想配列のファイル入出力

ベーシックな内容ですが、慣れるまでに時間がかかったのでまとめてみました。

実現したいこと

  • 連想配列をテキストファイル(txt, csv)に出力する
  • テキストファイルの文字列を配列に格納する

連想配列⇄txtファイル

  • fwriteの第二引数は文字列
  • fopenの第二引数
    • "w"は書き出しモード(fopenが呼び出される度にデータがまるっと上書きされる)
    • "a"追記モード(既存のデータの後ろに追加される)

連想配列→txtファイル

  • キーと値をカンマつなぎで文字列化
  • "\n"を入れて改行して出力されるようにしている
$data = array(
   array(1,"apple"),
   array(2,"banana"),
   array(3,"orange")
);
$file = fopen("data.txt", "w");
foreach($data as $key => $value){
   fwrite($file, $key.",".$value."\n");
}
fclose($file);

data.txtの中身はこちら

1,apple
2,banana
3,orange

txtファイル→連想配列

  • fileで一行一要素とする配列が返される
  • explodeで文字列1,applearray(1,"apple")に変換
  • $params[0]がキー、$params[1]が値の連想配列に変換
$data = file("data.txt");
$result = array();
foreach($data as $row){
   $params = explode(",", $row);
   $result[$params[0]] = $params[1];
}

配列$resultの中身はこちら

print_r($result);

Array ( [1] => apple [2] => banana [3] => orange )

上記の例だと、値の文字列の中に,が含まれると余分に分割される(例1,apple,cherry
explodeの第三引数に要素数の上限を渡せば回避できる

// $paramsの要素は2つまで!
$params = explode(",", $row, 2); // Array([1] => apple,cherry)

連想配列⇄csvファイル

連想配列→csvファイル

  • fputcsvについて
    • 第二引数は配列
    • 配列の要素をカンマ区切りで出力する
      • 1配列の出力が終わったら改行される
$data = array(
   1 => "apple",
   2 => "banana",
   3 => "orange" 
);

$file = fopen("data.csv", "w");
fputcsv($file, $data);
fclose($file);

data.csvの中身はこちら↓

apple,banana,orange

値だけファイルに出力されている
ちなみにキーが文字列の場合も同様に値だけ出力された

$data2 = array(
   "one" => "apple",
   "two" => "banana",
   "three" => "orange",
);

$file = fopen("data.csv", "w");
fputcsv($file, $data);
fclose($file);

キーも出力するには...

  • foreachで配列をループ
  • ループ内でfputcsvの第二引数にarray($key, $value)を渡す
$data = array(
   1 => "apple",
   2 => "banana",
   3 => "orange" 
);

$file = fopen("data.csv", "w");
foreach($data as $key => $value){
   fputcsv($file, array($key, $value));
}
fclose($file);

data.csvの中身はこちら

1,apple
2,banana
3,orange

csvファイル→連想配列

最後に

もっとスマートな書き方ありましたらぜひ教えてくださいm(_ _)m