PHP – 多次元配列の回し方の基本

超基本なんですが、ほんとうにプログラム初心者だった時に、ネットで調べてみてもあまり出てこなくて、苦戦した記憶があるので多次元配列の回し方の基本を解説します!

 

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を挟みつつ、コーディングしていくと分かりやすいと思います。

3 件のコメント

  1. mobkin 投稿者返信

    >ぱいせんさん
    メモリ使用量の話はまた別途個別に記事を書きますね!

  2. 柴犬 返信

    なんかのメモリがよく枯渇します。メモリ使用量の話、とっても気になる!!わくわく*・゜゚・*:.。..。.:*・'(*゚▽゚*)’・*:.。. .。.:*・゜゚・*

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です