前回まで
- 3章文字列・4章関数と、ここまでやってきたがここまでは前菜
- 4章関数後編は、結局自分でわかっているものはコードを書くのを省いた。時間があれば追加編集する
- いよいよ5章から難しくなってくるし、出題率もここから上がっていくので兜を締め直してがんばる
参考
PHP5技術者認定試験(上級)に学ぶ、実は知らなかった配列関数(3) | @tmak_tsukamotoさん
5章配列
配列の基本
※ ここ(上級)まで来た人なら、作り方ぐらいは知ってると思うが、ちゃんとした基本ルールを知って作ってるのと知らないで作ってるのとでは大違いなので、きちんと学ぶこと(自省もこめてここに記す)
- 配列はキーと値がペアで集まったもの
- ペアは合わせて要素と呼ぶ
- 配列作成方法は1)array()構文、(2)角括弧構文の2つ
- 配列にはインデックス配列と連想配列の2つがある。
- インデックス配列はキーが0から始まるもので、連想配列はキーが文字列になる。
- 以下はインデックス配列で、配列作成方法を説明する。
array構文
- array構文の場合、キーは0から始まる連番が振られる
- array(キー => 値)と明示的に記述することもできる。この場合、途中に改行を入れたほうが読みやすい
- 上のキーの指定は途中で省略してOK.その場合、その前の指定したキー+1したキー番号が振られる
以下は例
//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'
角括弧([])構文
- 1行目の代入文の実行で新しい配列が作成され、下の例の場合変数$aに格納
- 2行目・3行目の代入文で配列の末尾にキーと値が追加
- キーはarrayと同じく0からはじまる整数が振られる
//角括弧構文の基本の書き方
$a[] = 'a';
$a[] = 'b';
$a[] = 'c'; // 出力:0=>'a',1=>'b',2=>'c'
- 配列のキーと値は内部的な並び順を持つ。つまり、キーの順番ではなく、追加された順に並ぶ。 これを利用した問題が出題されたのを確認。しっかり理解すること。
//角括弧構文の基本の書き方
$b[3] = 'A';
$b[2] = 'B';
$b[1] = 'C'; // 出力:3=>'A',2=>'B',1=>'C'
→上を見ると、キーの順番に並んでおらず、ましてやキーが0に対応する値がない。
つまり追加順に並ぶということが証明されている。
連想配列
いきなり問題。
配列の出力が 'php' => 1, 'HTML'=> 2, 'CSS' => 3, 'JS' => 4 となるように
array構文と、角括弧構文と2通りの書き方で配列$aを記述せよ。
//array構文
$a = array('php' => 1,
'HTML' => 2,
'CSS' => 3,
'JS' => 4);
//角括弧構文
$a['php'] = 1;
$a['HTML'] = 2;
$a['CSS'] = 3;
$a['JS'] = 4;
- 多次元配列も作れる。
$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'キーに対応する値が更新されて4になるのみ。
- 配列のキーは文字列または整数を指定できるが、オブジェクトは指定できない
- 浮動小数点数をキーに指定した場合は、小数部分が切り捨てになる。(たとえば1.5だったら1、2.53だったら2)
- 整数として変換可能な文字列を指定した場合整数に変換されたものがキーに。現実としてありえない数値(10進数でないなど)を指定した場合変換は行われず、文字列としてキーに指定される。(たとえば'134'だったら134というキーに、’0123’だったら10進数としてはありえないので’0123’という文字列として指定される)
- 連想配列に角括弧構文で値を追加した場合、連想配列に数値キーがない場合0から始まる数値がキーとして追加されそこに値が格納される。もし数値キーがあれば、それに+1した数値がキーとなる。
さて、上記を踏まえた上で、下記の出力(print_r)はどうなるか記述せよ。
$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 )
となる。
記事の裏側
そういえば上記の問題を作るときに配列のキーの指定で最初から指定しようと思って、うっかり1から始めてしまってたが、本当は0から。
そのため出力が想定したのと違う結果になったが(笑)、そもそもルールとして、指定されたキーに+1したものが次のキーになるということさえわかってればこの結果も納得行くと思う。
自分でコード作ってテストしてみると想定と違った結果が出ても、理由がわかったりするとおもしろい。バグ検出の練習になると思う。