Edited at

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