LoginSignup
10
8

More than 3 years have passed since last update.

phpでcsvを読み込んで項目名をキーにした連想配列をつくる[メモ]

Last updated at Posted at 2020-06-12

最近仕事でcsvのデータをプログラム内で使う場面が多かったので
自分用のメモとして書きます。よかったら参考にしてください。

csvToArray.php
// csvの1列目をキーにした連想配列を返す(引数:csvファイルのパス)
function csvToArray($csvPath){
  $csvArray = array();
  $firstFlg = true;
  $keys = array();
  $count = 0;
  $file = fopen($csvPath, 'r');

  while ($line = fgetcsv($file)) {
    if($firstFlg){
      for($i = 0; $i < count($line); $i++){
        array_push($keys,$line[$i]);
      }
      $firstFlg = false;
    }else{
      for($i = 0; $i < count($line); $i++){
        $csvArray[$count][$keys[$i]] = $line[$i];
      }
      $count++;
    }
  }
  fclose($file);
  return $csvArray;
}

コピペで使えますが、もうちょっと綺麗に書けたかもしれないですね(笑)

使い方

1列目が項目名になっているcsvファイルのパスを指定してください

opening_day.csv
"area","name","opening_day"
"トゥモローランド","スペース・マウンテン","1983-4-15"
"ウエスタンランド","ビッグサンダー・マウンテン","1987-07-04"
"クリッターカントリー","スプラッシュ・マウンテン","1992-10-1"
main.php
$opening_day = csvToArray("./opening_day.csv");
var_dump($opening_day);

出力結果

$opening_day
array(3) {
  [0]=>
  array(3) {
    ["area"]=>
    string(24) "トゥモローランド"
    ["name"]=>
    string(30) "スペース・マウンテン"
    ["opening_day"]=>
    string(9) "1983-4-15"
  }
  [1]=>
  array(3) {
    ["area"]=>
    string(24) "ウエスタンランド"
    ["name"]=>
    string(39) "ビッグサンダー・マウンテン"
    ["opening_day"]=>
    string(10) "1987-07-04"
  }
  [2]=>
  array(3) {
    ["area"]=>
    string(30) "クリッターカントリー"
    ["name"]=>
    string(36) "スプラッシュ・マウンテン"
    ["opening_day"]=>
    string(9) "1992-10-1"
  }
}

こうしてcsvファイルをキー付きの連想配列にできました。

csvToArray関数の説明(興味ない人は読まなくて大丈夫です)

コメントアウトで行ごとに説明してます

csvToArray.php
// csvの1列目をキーにした連想配列を返す(引数:csvファイルのパス)
function csvToArray($csvPath){
  $csvArray = array();                            // 返す配列(入れ物の準備)
  $firstFlg = true;                               // 1周目の判別フラグ
  $keys = array();                                // 1列目の項目をキーとして保持しておく配列
  $count = 0;                                     // 2列目以降カウントする用の数値
  $file = fopen($csvPath, 'r');                   // ファイルを読み込む(r:読み込みモード)

  while ($line = fgetcsv($file)) {                // fgetcsvで行数のループ
    if($firstFlg){                                // 1周目 ---
      for($i = 0; $i < count($line); $i++){       // 項目数のループ
        array_push($keys,$line[$i]);              // 先ほど宣言したキー用の配列に格納
      }
      $firstFlg = false;                          // 1周目フラグをfalse
    }else{                                        // 2周目以降 ---
      for($i = 0; $i < count($line); $i++){       // 項目数のループ
        $csvArray[$count][$keys[$i]] = $line[$i]; // 先ほど宣言した返す配列に追加
      }
      $count++;                                   // 配列カウントを +1
    }
  }
  fclose($file);                                  // ファイルを閉じる
  return $csvArray;                               // 返送
}

感想

fgetcsv は便利

10
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8