CSVファイルを読み込み配列にセットし、そのまま表示するサンプルコードですが、ベースはSplFileObjectのfgetcsvの公式サンプルをそのまま引用させて頂いたものです。

 

概要

1.CSVファイルを1行ずつ読み込み

2.カンマごとに区切られた項目を変数にセット

3.変数を一つのグループにまとめるため、配列にセット

4.画面に表示

 

サンプルコード(hairetsu-test.php)

同じディレクトリに「hairetsu-sample.csv」を用意しています。

<?php
// ファイルを変数に格納
$filename = "./hairetsu-sample.csv";

$file = new SplFileObject($filename);
$file->setFlags(SplFileObject::READ_CSV);


foreach ($file as $row) {

  list($kitai, $ability, $hitpoint, $attack) = $row;

  $array1 = array("kitai" => $kitai, "ability" => $ability);
  $array2 = array("hitpoint" => $hitpoint, "attack" => $attack);
  $array = array_merge($array1, $array2);

  printf("%s 能力:%s HP:%s アタック:%s", $kitai, $ability, number_format($hitpoint), number_format($attack));
  printf("<br>");
}
unset($row);
?>

ループ制御 foreach(公式)でCSVファイルを1行ずつ読み込み

関数 list(公式)でCSVファイル内のカンマごとに区切られた項目を、配列のように一度に各変数にセット

関数 array(公式)で配列を生成します。インデックス => 値という形式です。

(参考)関数array_mergeは複数の配列をつなぐことのできる関数(公式)です。項目が増えた時に使えると思ったので、採用しました。

printf(公式)で画面に表示します。

number_format(公式)で千の位にカンマを入れました。

unset(公式)でforeachで使用した変数 rowへの参照を解除しました。

 

なお「hairetsu-sample.csv」の中身は

ガンキャノン,狙撃,1700,1500
ガンダム,反撃,1600,2000
ガンタンク,鉄壁,2300,1400

で、実行すると

ガンキャノン 能力:狙撃 HP:1,700 アタック:1,500
ガンダム 能力:反撃 HP:1,600 アタック:2,000
ガンタンク 能力:鉄壁 HP:2,300 アタック:1,400

となります。

 

Q.配列の要素数(数)が知りたい

A. count

添え字は0(ゼロ)始まり

サンプル

for($i = 0, $size = count($people); $i < $size; ++$i) {

*countを1回だけ実行し$sizeにセットするので、最適化される

 

 

Q.配列の最後の要素の値を知りたい。そしてその値を変えたい

A. 配列$data でcountを使った場合ですが、他にも方法はあると思います。

//最後の要素の値
print_r($data[count($data)-1]);
//その値を変える
$data[count($data)-1] = array('abc', 1000);

 

 

Q.配列の中での最大値が知りたい

A. max

 

Q.配列の中身が見たい

A.

簡易:var_export, print_r

詳細:var_dump

正しい使い方

var_dump($records[1]);

print_r($records);

 

エラー「Notice: Array to string conversion」となる例

print($records[0]);

 

Q.listを使わない方法は?

A.listは項目名がわかりやすくメンテしやすいメリットがあるものの、項目の数が多い場合には煩雑に見える可能性がある。

そういう場合は「listを使わず、配列の要素を直接使う方」が楽な場合もある。

「listを使う場合」

foreach ($file2 as $value2) {

list($clus_day, $jichi_cd, $jichi_mei, $place, $hosoku, $cl_no1, $cl_no2) = $value2;

if (date(‘Y/n/j’, strtotime($clus_day)) >= date(‘Y/n/j’, strtotime(‘-2 day’))){
$cluster_new .= $clus_day.’ ‘.$jichi_mei.'<BR>’.”\n”;}

}

「listを使わない場合」

foreach ($file2 as $value2) {

if (date(‘Y/n/j’, strtotime($value2[0])) >= date(‘Y/n/j’, strtotime(‘-2 day’))){

$cluster_new .= $value2[0].’ ‘.$value2[2].'<BR>’.”\n”;}

}

PHPメニューへ戻る

 



ȥåץڡ