PHP5上級試験/準上級試験の上級合格に挑戦(7)　5章配列前編

# 前回まで

+ 3章文字列・４章関数と、ここまでやってきたがここまでは前菜
+ ４章関数後編は、結局自分でわかっているものはコードを書くのを省いた。時間があれば追加編集する
+ いよいよ５章から難しくなってくるし、出題率もここから上がっていくので兜を締め直してがんばる

# 参考

[PHP5技術者認定試験(上級)に学ぶ、実は知らなかった配列関数(3) | @tmak_tsukamotoさん](https://qiita.com/tmak_tsukamoto/items/2eb6d10e83b6c00981c9)

# 5章配列

## 配列の基本
※ ここ（上級）まで来た人なら、作り方ぐらいは知ってると思うが、ちゃんとした基本ルールを知って作ってるのと知らないで作ってるのとでは大違いなので、きちんと学ぶこと（自省もこめてここに記す）


+ 配列はキーと値がペアで集まったもの
+ ペアは合わせて<b>要素</b>と呼ぶ
+ 配列作成方法は１）array()構文、（２）角括弧構文の２つ
+ 配列にはインデックス配列と連想配列の２つがある。
+ インデックス配列はキーが０から始まるもので、連想配列はキーが文字列になる。
+ 以下はインデックス配列で、配列作成方法を説明する。


### array構文
+ array構文の場合、キーは０から始まる連番が振られる
+ array(キー => 値）と明示的に記述することもできる。この場合、途中に改行を入れたほうが読みやすい
+ 上のキーの指定は途中で省略してOK.その場合、その前の指定したキー＋１したキー番号が振られる

以下は例

```index.php
//array構文の基本の書き方
 array('a','b','c'); // 出力：0=>'a',1=>'b',2=>'c'
//array構文で明示的に記述。改行入れて読みやすくする
 array(1 => 'a',
       2 => 'b',
       4 => 'c');　// 出力：1=>'a',2=>'b',4=>'c'
//途中でキーの指定を途中から省略
 array(10 => 'a','b','c'); // 出力：10=>'a',11=>'b',12=>'c'　
```
### 角括弧([])構文
+ １行目の代入文の実行で新しい配列が作成され、下の例の場合変数＄aに格納
+ ２行目・３行目の代入文で配列の末尾にキーと値が追加
+ キーはarrayと同じく0からはじまる整数が振られる

```index.php
//角括弧構文の基本の書き方
 $a[] = 'a';
 $a[] = 'b';
 $a[] = 'c'; // 出力：0=>'a',1=>'b',2=>'c'
```
+ 配列のキーと値は内部的な並び順を持つ。つまり、キーの順番ではなく、<b>追加された順に並ぶ。</b> これを利用した問題が出題されたのを確認。しっかり理解すること。

```index.php
//角括弧構文の基本の書き方
 $b[3] = 'A';
 $b[2] = 'B';
 $b[1] = 'C'; // 出力：3=>'A',2=>'B',1=>'C'
```
→上を見ると、キーの順番に並んでおらず、ましてやキーが０に対応する値がない。
　つまり追加順に並ぶということが証明されている。

### 連想配列
いきなり問題。

配列の出力が 'php' => 1, 'HTML'=> 2, 'CSS' => 3, 'JS' => 4　となるように
array構文と、角括弧構文と２通りの書き方で配列＄aを記述せよ。
　　
　
　


```index.php
//array構文
 $a = array('php' => 1,
            'HTML' => 2,
            'CSS' => 3,
            'JS' => 4);

//角括弧構文
 $a['php'] = 1;
 $a['HTML'] = 2;
 $a['CSS'] = 3;
 $a['JS'] = 4;
```

+ 多次元配列も作れる。

```index.php
　＄a = array(
         array(1,2,3),
         array(4,5,6)
        );

// 出力
// 0 =>(
//     0 => 1;
//     1 => 2;
//     2 => 3;
//   )
//   1 => (
//     0 => 4;
//     1 => 5;
//     2 => 6;  
//   )
```

### 気をつけるべきルール

+ たとえば array('php'=> 3,'php'=> 4)のように重複したキーを持つ配列は作れない。むしろ、この場合は、'php'キーに対応する値が更新されて４になるのみ。
+ 配列のキーは文字列または整数を指定できるが、オブジェクトは指定できない
+ 浮動小数点数をキーに指定した場合は、<b>小数部分が切り捨てに</b>なる。（たとえば１．５だったら１、２.５３だったら２）
+ <b>整数として変換可能な文字列を指定した場合整数に変換されたものがキーに。現実としてありえない数値（１０進数でないなど）を指定した場合変換は行われず、文字列としてキーに指定される。</b>（たとえば'１３４'だったら１３４というキーに、’０１２３’だったら１０進数としてはありえないので’０１２３’という文字列として指定される）
+ <b>連想配列に角括弧構文で値を追加した場合、連想配列に数値キーがない場合０から始まる数値がキーとして追加されそこに値が格納される。もし数値キーがあれば、それに＋１した数値がキーとなる。</b>

さて、上記を踏まえた上で、下記の出力(print_r）はどうなるか記述せよ。

```index.php
 $a = array(
      'php' => 1,
      'HTML' => 2);
  $a [] = 'css';
  $a [] = 'js';
  print_r($a);

 $b = array(
      'php' => 1,
      'HTML' => 2,
       1 => 3);
  $b [] = 'css';
  $b [] = 'js';
  print_r($b);

 $c = array(
       1 => 3,
      'php' => 1,
      'HTML' => 2);
  $c [] = 'css';
  $c [] = 'js';
  print_r($c);


```
出力は

Array（$a) ( [php] => 1
　　　　 [HTML] => 2 
　　　　　[0] => css
　　　　　 [1] => js ) 

Array($b) ( [php] => 1
　　　　　[HTML] => 2
 　　　　　[1] => 3 
　　　　　 [2] => css
　　　　　   [3] => js ) 

Array($c) (  [1] => 3 
　　　　　[php] => 1
　　　　　[HTML] => 2
　　　　　[2] => css
　　　　　[3] => js )

となる。

# 記事の裏側

そういえば上記の問題を作るときに配列のキーの指定で最初から指定しようと思って、うっかり１から始めてしまってたが、本当は０から。
そのため出力が想定したのと違う結果になったが（笑）、そもそもルールとして、<b>指定されたキーに＋１したものが次のキーになる</b>ということさえわかってればこの結果も納得行くと思う。
自分でコード作ってテストしてみると想定と違った結果が出ても、理由がわかったりするとおもしろい。バグ検出の練習になると思う。