【PHP】配列や連想配列が覚えづらかったので学校に例えてみた【初心者向け】


配列を小学校に例えてみることにしました。

※わかりやすさ重視でいろいろ説明をはしょっています。

ブログでも書いています。-> [PHP配列を学校に例えてみた](http://coinbaby8.com/php-how-to-learn-array.html)

<h2>PHPの配列の使い方〜わかりやすさ重視〜</h2>

<img src="http://coinbaby8.com/wp-content/uploads/2018/11/1kumi.jpg" alt="" width="790" height="480" class="alignnone size-full wp-image-1622" />

『PHP』に限らず、ほとんどのプログラミング言語には、**『変数』**という機能があります。

『変数』というのはざっくりいうと**『箱』**の事で、

『箱』をつくって、その中に好きな文字や数字を入れて、取り出しやすくしたものです。

※『PHP』の『変数』は、頭に <b>ドルマーク</b>が必要になります。

例えばとある学校の、1組をプログラムで表したいとしたら、

```
$seito_1 = '本田';
$seito_2 = '香川';
$seito_3 = '長友';
```

と書いたとして、

```
echo $seito_1
```

と書くと、『本田』と表示されます。

ただこの書き方だと、

例えばクラスに30人もいたら変数だらけになってしまいます。


なので、1つの箱にまとめて要素をつっこめる方法があります。

それが**『配列』**です。


例えば **$seito**という変数(箱)をつくって、その中にまとめて生徒の名前を追加します。

```
$seito = ['本田','香川','長友','乾','大迫'];
```

という形で、 変数(箱)に入れる値を、<b>[]</b>で囲みます。

呼び出す時には、

```
print_r($seito[2]);
```

とすると、長友くんが呼び出されます。

**あれ？長友くんは3番目じゃないの？**

と思いがちですが、プログラミングは**0から数える**
事が多く、配列も0から数えるつくりになっていますので、

1,2,3,4,5 ではなく、

0,1,2,3,4 の番号で指定する形ですね。

<h2>PHPの連想配列と多次元配列の使い方〜小学校のクラスが複数あったら</h2>

<img src="http://coinbaby8.com/wp-content/uploads/2018/11/1kumi-2kumi.jpg" alt="" width="790" height="480" class="alignnone size-full wp-image-1621" />

**1組だけでなく、2組も把握したいんだけどどうしたらいい？**

小学校であればもちろん、2組や3組がある学校もありますよね。

そんな場合でも役に立つのが『配列』です。

実は、『配列』の中にさらに『配列』を入れ子にすることができます。
(多次元配列といったりします。)

コードにするとこんな感じです。

```PHP
$seito = [
    '1kumi' => [
        '本田','香川','長友','乾','大迫'
    ],
    '2kumi' => [
        '川島','柴崎','槙野','長谷部','酒井'
    ]
];
```


$seito という変数(箱)の中に, 1組と2組で分けて、それぞれ生徒の名前をまとめています。


2組の2番目の人を呼び出す時はこうやって指定すると、

```
print_r($seito['2kumi'][1]);
```

柴崎くんが呼び出されます。

```
print_r($seito['2kumi'][2]);
```

にすると、槙野くんですね。

<h3>PHP 配列(添字配列)と連想配列の違い</h3>


$seito という変数の後に、 ['2kumi'] という文字と、[1] という文字を指定していますが、

PHPでは、

***配列の中のどの場所？***

というのを指定するために、文字や数字を使うことができます。


- 配列のキーが数字：配列(添字配列)・・指定なしならこちら
- 配列のキーが文字：連想配列・・文字から内容を連想しやすい

指定しないと自動的に0から数字が割り振られます。



<h2>PHPの連想配列と多次元配列〜小学校の学年が複数あったら</h2>

<img src="http://coinbaby8.com/wp-content/uploads/2018/11/2nen-2kumi.jpg" alt="" width="790" height="480" class="alignnone size-full wp-image-1620" />

これまでは1学年だけを例にしていましたが、

小学校となると1年生だけではなく、2年生もいますよね。

勘のいい人ならわかると思いますが、

配列の中に配列を入れる事で、学年も表現できます。

コードはこんな感じ。

 
```PHP
$seito = [
    '2nen' => [
        '1kumi' => [
            '遠藤','内田','松井','岡崎','中村'
        ],
        '2kumi' => [
            '今野','駒野','大久保','楢崎','闘莉王'
        ]
    ],
    '1nen' => [
        '1kumi' => [
            '本田','香川','長友','乾','大迫'
        ],
        '2kumi' => [
            '川島','柴崎','槙野','長谷部','酒井'
        ]
    ]
];
```


新たに 2nen や 1nen という項目が増えましたが、その中身は前のコードと同じですね。

例えば2年2組の闘莉王くんを呼び出す時はこんな感じで指定します。

```
print_r($seito['2nen']['2kumi'][4]);
```

簡単ですね。

これを応用すれば、

例えば30人のクラスがあって、3組あって、6年生まであったとしたら、

30×3×6 = 180 人分の情報になりますが、

『配列』をうまく使えば、

**1つの『変数』に180人分の情報をまとめることができます**。


配列パワーすごい←(語彙力


また、配列は何段階も作ることができます。例えば・・


<h2>PHPの連想配列と多次元配列〜小学校が複数あったら</h2>

<img src="http://coinbaby8.com/wp-content/uploads/2018/11/gakko.jpg" alt="" width="790" height="480" class="alignnone size-full wp-image-1619" />

仮に熊本小学校と、福岡小学校があったとしたら、

熊本小学校の、
2年の、
1組のだれだれ、

というのも1つの変数(箱)の中に入れることができます。

 
```PHP
$seito = [
    'fukuoka' => [],
    'kumamoto' => [
        '2nen' => [
            '1kumi' => [
                '遠藤','内田','松井','岡崎','中村'
            ],
            '2kumi' => [
                '今野','駒野','大久保','楢崎','闘莉王'
            ]
        ],
        '1nen' => [
            '1kumi' => [
                '本田','香川','長友','乾','大迫'
            ],
            '2kumi' => [
                '川島','柴崎','槙野','長谷部','酒井'
            ]
        ]
    ]
];
```

呼び出しはこんな感じ。

```
print_r($seito['kumamoto']['2nen']['1kumi'][2]);
```


これで松井君が呼び出せます。(fukuokaの方ははしょってますがこれでも動きます。)



<h2>PHP連想配列の覚え方〜補足</h2>

**名前だけじゃなくて、年齢や性別、クラブ活動なんかも登録できるの？**

という場合ももちろんできます、配列ならね。

コードはこんな感じです。

 
```PHP
$seito = [
    0 => [
        'name' => '本田',
        'age' => '7' 
    ],
    1 => [
        'name' => '香川',
        'age' => '6' 
    ],
];
```


呼び出しはこう。

```
print_r($seito[1]['age']);
```

1番目のage(年齢) なので 6 と表示されます。

もちろん数字ではなく、文字でも指定できます。
 
```PHP
$seito = [
    'honda' => [
        'name' => '本田',
        'age' => '7' 
    ],
    'kagawa' => [
        'name' => '香川',
        'age' => '6' 
    ],
];
```


呼び出しはこう。

```
print_r($seito['kagawa']['age']);
```

読む分にはこっちの方がわかりやすいかもですね。


<h2>PHPの連想配列・多次元配列〜実際のプログラミングでは</h2>


実際に小学校の情報をプログラミングで管理しようと思ったら、

生徒達の情報をPHPコードで直書きするのではなく、

Mysqlなどのデーターベースを使って情報を登録しておいて、

PHPからデータベースにつないで情報を表示する、という形になるかと思います。


指定の仕方も変数をいれることが多いので、こういった文字列になるかなと思います。

```
$seito[$gakko][$gakunen][$kumi][$number]
```

プログラミング的には数字の方がやりやすいので、

```
$seito[1][2][0][2]);
```

というような形を想定しつつプログラミングを組んだりします、が、


**カッコばかりで読みづらいなぁ・・**

なんて思ったりすることもあるので、その場合は配列の中身を整理してみるといいかもですね。



<h2>まとめ PHPの配列や連想配列・多次元配列について</h2>


実はこの記事は、 <a href="https://note.mu/iriedevlop" target="_blank">#入江開発室</a> の #voyage というWebアプリケーションのソースコードを見ていた時に、

配列の理解が浅いなと思ったことがきっかけで、まとめてみることにしました。


PHPに限らずプログラミングの規模が大きくなるにつれ、

配列・連想配列・多次元配列は必須になるので、

ぜひしっかり把握した上で、プログラミングライフを楽しみたいものですね。