超基本なんですが、ほんとうにプログラム初心者だった時に、ネットで調べてみてもあまり出てこなくて、苦戦した記憶があるので多次元配列の回し方の基本を解説します!
foreachでループする
phpでは連想配列が便利でよく使います、また連想配列を回すときは配列要素の最初から最後までループさせるforeachもよく使います。
(foreachだとプログラム実行中、メモリ上に配列全体のコピーを作るらしいので、デカい配列だとメモリをガッツリ食ってしまう模様、データ量が多いときは注意かも)
では、例を出して説明していきます
以下のような「$ken_city_array」という配列があったとします
(1次元に都道府県名、2次元に連番をキーとした市区郡町村が入っている)
$ken_city_arrayのダンプ Array ( [三重県] => Array ( [0] => いなべ市 [1] => 三重郡 [2] => 亀山市 ・・・ ) [京都府] => Array ( [0] => 与謝郡 [1] => 久世郡 [2] => 乙訓郡 ・・・ )
そして、この配列を以下のようなCSV形式で出力したい、とします
三重県,いなべ市 三重県,三重郡 三重県,亀山市 ・・・ 京都府,与謝郡 京都府,久世郡 京都府,乙訓郡 ・・・
上記の例は、以下のようなソースコードで実装できます
foreach($ken_city_array as $key1=>$value1){ foreach($value1 as $key2=>$value2){ print $key1.",".$value2."\n"; } }
では、詳しく解説していきます!
■1行目{
foreach($ken_city_array as $key1=>$value1){ foreach($value1 as $key2=>$value2){ print $key1.",".$value2."\n"; } }
「$ken_city_array」は、1次元目が都道府県名、2次元目が市区郡町村の配列です。 これをぐるぐる回して処理したいので、foreach()の中に放り込み、asを挟んで、$key1=>$value1と記述します。 こうすることで、$key1には1次元目のキーが、$value1には1次元目のバリューがセットされます 注意しなければならない点は、1次元目のキーは三重県、京都府・・・といった都道府県名という値であり、変数の$key1にはそのまま文字列変数として格納されますが、1次元目のバリューは以下のような配列です。 そのため、↓の配列データが$value1に格納されます。 ( [0] => いなべ市 [1] => 三重郡 [2] => 亀山市 ・・・ )
■2行目
foreach($ken_city_array as $key1=>$value1){ foreach($value1 as $key2=>$value2){ print $key1.",".$value2."\n"; } }
慣れるまではココが分かりづらいかもしれませんが、1個目のforeachの中で、さらにforeachを書いています。 そして、今度foreachに放り込んで、ぐるぐる回したい配列は先ほどの$value1です。 こいつには連番をキーとした市区郡町村の配列が入っていましたね(コレ↓) ( [0] => いなべ市 [1] => 三重郡 [2] => 亀山市 ・・・ ) つまり、今度は$key2に連番(0,1,2,・・・)が入り、$value2には市区郡町村(いなべ市、三重郡、亀山市、・・・)と入ります。
一度、ここでそれぞれのキーとバリューに何が入っているのか整理します。
変数/配列 | 入っているデータ |
---|---|
$key1 | 都道府県名がセットされている(変数) |
$value1 | 連番をキーとした市区郡町村の配列がセットされている(配列) |
$key2 | 連番がセットされている(変数) |
$value2 | 市区郡町村名がセットされている(変数) |
■3行目
foreach($ken_city_array as $key1=>$value1){ foreach($value1 as $key2=>$value2){ print $key1.",".$value2."\n"; } }
foreachでデータがぐるぐる回されて、配列内のすべてのデータに対して、3行目のprintが順番に処理されます。 printの内容は、$key1の都道府県名と、$value2の市区郡町村名をカンマを挟んで出力し、行末で改行を入れています。
いかがでしょうか。
最初はキーとバリューに何が入っていて、何層のループをしなければならないか?あたりが掴みにくいと思いますが、
最初は、時間がかかっても、配列データのダンプを見ながら、1コずつkeyとvalueを整理し、時折デバッグのprintを挟みつつ、コーディングしていくと分かりやすいと思います。
データ量も気にしてみます٩( ᐛ )و
>ぱいせんさん
メモリ使用量の話はまた別途個別に記事を書きますね!
なんかのメモリがよく枯渇します。メモリ使用量の話、とっても気になる!!わくわく*・゜゚・*:.。..。.:*・'(*゚▽゚*)’・*:.。. .。.:*・゜゚・*