こんにちは。いっとくです!
都内の制作会社で日々PHPをいじっています。
最近は堅牢なコードというのにとても興味がありまして、可能な限りタイプヒンティングで型を指定しておきたいし、比較演算子を使うときは厳密比較を使いたいわけです。
そんな中ビクビクしてちゃんと比較していなかったことがあります。
それは配列のキーを条件分岐に使うとき!!
ぶっちゃけよくわかってなかったから放置していたのですが、しっかり調べたら割とシンプルだったのでアウトプットしようと思います。
PHPで連想配列のキーは文字列と整数しかない!
はい、というわけで見出しの通りなのですが、配列のキーは2つの型しかなく、文字列型か整数型のどちらかです。
ということで、いろんな型を配列のキーに突っ込んでみましょう。
ではまずは色々な文字列をキーにして配列を作ってみましょう。
<?php
$array = [
'文字列' => '文字列',
'1' => '1',
'1.5' => '1.5',
'TRUE' => 'TRUE',
'FALSE' => 'FALSE',
'NULL' => 'NULL',
'' => ''
];
var_dump($array);
/* array(6) {
["文字列"] => string(9) "文字列"
[1] => string(1) "1"
["1.5"] => string(3) "1.5"
["TRUE"] => string(4) "TRUE"
["FALSE"] => string(5) "FALSE"
["NULL"] => string(4) "NULL"
[""] => string(0) ""
}
*/
はい、ほとんどは想定通りキーが文字列のままになっていますが、一つだけ変なのが混じってますね。
そうです、文字列の1で作ったはずのキーだけ整数型にキャストされてます。
以上のことから、文字列のキーは基本的に文字列のままキーになりますが、整数だけは整数型に変換されます。
では他の型でも試してみましょうか!
ということで整数型と浮動小数点型の数字の一族にキーになってもらいます。
<?php
$array = [
1 => 1,
1.5 => 1.5,
0 => 0
];
var_dump($array);
/*
array(2) {
[1] => float(1.5)
[0] => int(0)
}
*/
はい、というわけで出力してみると、そもそも数が合わん。1個行方不明になりました。
よく見てみると、1のキーにfloatの1.5が格納されていますね。
つまりfloatの数字をキーにすると、小数点以下を削り取った整数型にキャストされ、もし同じキーがあった場合は再代入されちゃいます。
うっかり小数点型の数字をキーにしたらバグが出ること間違いなしですね。
まぁ、そんなことをしないといけない状況に出くわすことなんて中々ないと思いますが。
次にbool型も
<?php
$array = [
TRUE => TRUE,
FALSE => FALSE
];
var_dump($array);
/*
array(2) {
[1] => bool(true)
[0] => bool(false)
}
*/
まぁ、予想通りっちゃ予想通りですが、trueは整数型の1にfalseは整数型の0にキャストされます。
最後にNULLを入れてみましょう。
<?php
$array = [
NULL => NULL
];
var_dump($array);
/*
array(1) {
[""] => NULL
}
*/
キーが空文字になっちゃいましたね〜
なんとなく0になりそ〜とか思っていたのですが、まさかの空文字。
これもちょっと気をつけないと間違えそうな気がする。
とはいえ配列のキーで覚えておく必要があるのは、整数っぽい文字列がint型に変換されるところでしょう。
これを知っておけば以下のようなコードがあったときに思い切って厳密比較にできますね。
<?php
foreach ($array as $key => $value) {
if ($key == 1) { // $keyは必ず整数になるので===でオッケー!!
$return = $value + 100;
}
}
配列で何が渡されるかわからないから演算子を==にしていたのを、気にすることなく===にできますね!やったー!
厳密比較サイコー!
はいということで、PHPでは配列のキーがキャストされるよっていう話でした!
さよなら!
コメント