phpの配列で仕様というか癖というか、バグの元になり得る
指定方法を本で読んだので自分なりにまとめてみます。
まずはシンプルな配列
ソースを見てから整理していったほうがわかりやすいと思うので
まずは通常のシンプルな配列
$first_array = ["a", "b", "c"];
echo "first_array[2]は" . $first_array[2] . "\n";
first_array[2]はc
first_arrayの3番目の値を表示していますね。
これは配列に自動的に添字と呼ばれる連番が登録され
その添字をつかって値にアクセスしているという状態になります。
配列に値を追加する際に数字でkeyを指定して追加すると・・・
以下は一見、通常の配列に添字で追加していると思いがちです
$test_array = [0, 1];
$test_array["a"] = "えい";
$test_array[5] = 5;
$test_array[4] = 4;
$test_array[2] = 2;
$test_array[3] = 3;
これを以下のように様々な形でアクセスしてみると・・・
echo print_r($test_array)."\n";
echo "---for文---\n";
for ($i = 0; $i < count($test_array); $i++) {
echo $test_array[$i]."\n";
}
echo "---foreach文---\n";
foreach ($test_array as $e) {
echo $e."\n";
}
echo "---\n";
echo $test_array["a"] . "\n";
echo $test_array[3] . "\n";
Array
(
[0] => 0
[1] => 1
[a] => えい
[5] => 5
[4] => 4
[2] => 2
[3] => 3
)
1
---for文---
0
1
2
3
4
5
PHP Notice: Undefined offset: 6 in /var/www/html/array-order.php on line 18
---foreach文---
0
1
えい
5
4
2
3
---
えい
3
となります。
まず結果の最初を見てみると配列がどのような順番で格納されているかがわかります。
次にfor文を見てみましょう。
このfor文だけを見ると一見、以下のようなイメージで配列に格納されていると考えがちです。
Array
(
[0] => 0
[1] => 1
[2] => 2
[3] => 3
[4] => 4
[5] => 5
[a] => えい
)
しかしこれは認識違いです。
正しくは上記print_rの部分で表示している。
Array
(
[0] => 0
[1] => 1
[a] => えい
[5] => 5
[4] => 4
[2] => 2
[3] => 3
)
1
上記のような形で格納されています。
このことはfor文で表示されたNoticeとforeachの結果を見みても解ります。
noticeの意味は6番目の要素はないということではなく
keyが6の値はありませんという意味になります。
まとめると
配列に値を追加する際に、keyを数字で指定して値を追加し
$array[数字]のような形で値を呼び出すと
添え字の数字を指定したのではなくkeyの数字を指定したと解釈されることになります。
phpの配列は基本的に連想配列(マップ)で実装されているということのようです。
バグを生まないために
・配列のkeyを数字で指定するのは避けたほうがよさそう。