トップページ > ホームページ作成 > 多次元配列
多次元配列にデータを格納する方法です。ここでは、あとからSmartyなどで扱いやすいデータにするため、一行に異なる数のデータがある変則CSVファイルから、大見出し、中見出し、複数の内容などを多次元配列に格納してみました。
ここで扱う多次元配列とは
つぎのような、テキストデータ(ファイル名:"mult_arry_data.txt")をコメントや改行だけの行を除き項目ごとに配列に入れられれば、「foreach」や「while」をつかって配列を順番に呼び出せ、決まったフォーマットへの表示がデータの加工がやりやすくなります。Smarty等のテンプレートエンジンに表示も簡単に出来ます。配列には、データを一塊ごとにくくって格納する必要があります。
**,00,*****大見出し******
大見出し1
**,01,*****大見出しの内容******(" "内は一つのデータ)
"あしたは、
てんきです
よ。"
**,10,*****中見出し******
中見出し1-1
**,11,*****中見出しの内容******(複数可能)
"内容a1-1,
内容a1-1(2行目)
内容a1-1(3行目)
"
内容b1-1
**,10,*****中見出し******
中見出し1-2
**,11,*****中見出しの内容******(複数可能)
内容a1-2
内容b1-2
//,コメント
**,10,*****中見出し******
中見出し1-3
**,11,*****中見出しの内容******(複数可能)
内容a1-3
//,コメント
内容b1-3
**,00,*****大見出し******
大見出し2
**,10,*****中見出し******
中見出し2-1
**,11,*****中見出しの内容******(複数可能)
内容a2-1
内容b2-1
//,コメント
今回は、上記データを『「大見出し」-(「大見出しの内容」)-「中見出し」(複数)-「中見出しの内容」(複数)』という配列のくくりに入れます。多次元配列は、慣れていないと大変ですが、次のような配列にします。これを直接書いてもいいのですが、訳がわからなくなりますので、PHPをつかって上記テキストファイルから自動的に多次元配列にいれるようにします。
Array ( [0] => Array ( [0] => 大見出し1 [1] => あしたは、てんきですよ。 [2] => Array ( [0] => Array ( [0] => 中見出し1-1 [1] => Array ( [0] => 内容a1-1, 内容a1-1(2行目) 内容a1-1(3行目) [1] => 内容b1-1 ) ) [1] => Array ( [0] => 中見出し1-2 [1] => Array ( [0] => 内容a1-2 [1] => 内容b1-2 ) ) [2] => Array ( [0] => 中見出し1-3 [1] => Array ( [0] => 内容a1-3 [1] => 内容b1-3 ) ) ) ) [1] => Array ( [0] => 大見出し2 [2] => Array ( [0] => Array ( [0] => 中見出し2-1 [1] => Array ( [0] => 内容a2-1 [1] => 内容b2-1 ) ) ) ) )
多次元配列変換のサンプルリスト
上記、"mult_arry_data.txt"のデータを1行づつ読み込んで配列に入れていきます。
「fgetcsv」関数は、CSVデータを読み込んでくれますので利用させてもらいました。通常のCSVファイルは、各行のカンマ","で区切られたデータ数は同じです。このファイルは、ルールに反しますので、属性を"txt"にしました。「fgetcsv」関数は、各行のデータ数が異なっても","がない1行ひとつのデータでも順番に配列に入れてくれます。ひとつしかないデータの場合の配列のキーは[0]となります。また、ダブルコーテーション「" "」で囲ったデータは、改行やカンマ","があっても、1行内の一つのデータとして扱ってくれます。
ここで取り決めた、テキストデータのルールは次のとおりです。たったこれだけのルールです。HTLMタグなどに比べれば非常に見やすく、データ表示するテンプレートの方でタグや表示する配置位置を替えられますので、応用が利きます。
- 定義行(**,00 など)に続いて、配列に入れたいデータを書く。
定義行に続くデータは複数行でも可能である。 - 改行だけの行と「//,」からはじまる行は読み飛ばす。
サンプルリストの流れは、次の通りです。「**,」のデータが最初にあったら、続く行のデータの種類を「**,」につづく「00」「10」等のデータから判断し、「$case_v」に記憶します。改行だけの行と「//,」は、読み飛ばします。前期以外のデータが来た時、「$case_v」の値により、配列のキー変数$i、$j、$kにより、適する配列に入れていきます。$iは大見出しが来る毎にインクリメントし、$jは中見出しが来る毎にインクリメント大見出しが来る度にリセットされます。$kは中見出し内容が来る毎にインクリメント中見出しが来る度にリセットされます。
<?php
//txtVファイル
$fname = "mult_arry_data.txt";
//ファイルを開く
$file = fopen($fname,"r");
//データを二次元アレイに格納
$i=-1;//$iリセット
while ($arry = fgetcsv($file,1000,",")){
if ( $arry[0]=="**"){
switch ($arry[1]) {
case "00"://大見出し(00,)必須
$case_v = "00";
break;
case "01"://大見出し00のコメント(01,)
$case_v = "01";
break;
case "10"://中見出し(10,)必須
$case_v = "10";
break;
case "11"://中見出し内容(11,)複数設定可
$case_v = "11";
break;
default:
break;
}
} elseif ( $arry[0] != "" and $arry[0] !="//" ) {
switch ($case_v) {
case "00"://大見出し(00,)
$i++;
$j=-1;//$jリセット
$dcsv[$i][0] =$arry[0];
break;
case "01"://大見出し00のコメント(01,)
$dcsv[$i][1] =$arry[0];
break;
case "10"://中見出し(10,)必須
$j++;
$k=-1;//$kリセット
$dcsv[$i][2][$j][0] =$arry[0];
break;
case "11"://中見出し内容(11,)複数設定可
$k++;
$dcsv[$i][2][$j][1][$k] =$arry[0];
break;
default:
break;
}
}
}
//ファイルを閉じる
fclose($file);
//アレイをプリント
print_r ($dcsv);
?>
</body>
</html>
このファイルを実行すると、めでたくテキストデータ(ファイル名:"mult_arry_data.txt")をよみこんで、希望する多次元配列にすることが出来ます。これで、変則CSVファイルのデータを多次元配列に読み込むことが出来ました。
レンタルサーバーのロリポップでは、動作確認できています。