そもそも通常配列と連想配列との区別はないので、これらを混在させることも可能。
例
<?php
$data = [‘山田’ => ‘太郎’, 15 => ‘二郎’, ‘鈴木’ => ‘三郎’, ‘四郎’];
print_r($data);
//結果:
Array
(
[山田] => 太郎
[15] => 次郎
[鈴木] => 三郎
[16] => 次郎
)
この場合も、キーを省略した場合には、「その時点での最大インデックス+1」が次のインデックスとして割り振られる。
ここまではキーとして整数、または文字列を指定してきたが、そのほかにも、任意のデータ型を指定できる。
下記例
ただし、整数/文字列以外のキーが指定された場合には、内部的に、整数/文字列に変換される。
<?php
$data = [
‘str’ => 0,
‘7’ => 1,
‘07’ => 2,
10.5 => 3,
true => 4,
null => 5,
];
print_r($data);
//結果:
Array
(
[str] => 0
[7] => 1
[07] => 2
[10] => 3
[1] => 4
[] => 5
)
変換のルールは以下のとおり。
①整数値として正しい形式の文字列はそのまま整数値に変換される。ただし、「07」のように10進数として妥当でない値はそのまま文字列となる。
②小数点数は切り捨てられる(四捨五入ではない)
③true/false値は、それぞれ1/0に変換される
④null値はから文字列に変換される
ちなみに、配列やオブジェクトを、配列のキーとすることはできない。
エラーとなるので注意。
前回も述べたように、PHPはデータ型に関して比較的寛容な言語。
データの中身から自動的に判断し、適切な入れ物(変数)を割り当ててくれるのがPHPの良いところ。
しかしそのために、ある程度本格的なコードを書き始めると、思わぬ挙動に悩まされることもある。
ここでは、データ型の暗黙的な変換と、明示的な変換(キャスト)について学ぶ。
暗黙的な変換
PHPでは、そのときどきの状況に応じて値を適切なデータ型へ変換することで、「それぞれの文脈に応じてできるだけ何らかの処理をしよう」とする。
これを型の暗黙的な変換という。
たとえば前回の「数値や文字列を論理型とみなす」などの処理は典型的な暗黙的な変換であり、PHPの世界ではこのような処理が(特に演算の局面で)常時行われている。
ただし時としてその変換は明確でないことから混乱の元にもなる。
厳密な比較や演算をしたい場合、暗黙的な変換に頼るのは必ずしも好ましくない。
そのような場合には、キャストと言う仕組みを利用することで、値を特定の型に強制的に変換できる。
構文キャスト
(データ型)値
キャスト構文で利用できるデータ型は下記のとおり。
利用可能なキャスト型
データ型 | 概要 |
---|---|
(int)、(integer) | 整数型へのキャスト |
(bool)、(boolean) | 論理型へのキャスト |
(float)、(double) | 浮動小数点型へのキャスト |
(string) | 文字列型へのキャスト |
(binary) | バイナリ文字列型へのキャスト |
(array) | 配列へのキャスト |
(object) | オブジェクトへのキャスト |
下記は具体例
具体例に使われるvar_dumpは、変数(値)の情報を出力する関数。
print_r関数に似ているが、データ型も加味した情報を出力してくれるので、型も含めて値を確認したい場合に便利。
<?php
var_dump((int)1530.95);
①//結果: int(1530)
var_dump((int)-1530.95);
②//結果: int(-1530)
var_dump((int)true);
③//結果: int(1)
var_dump((string)true);
④//結果: string(1)”1”
var_dump((int)false);
⑤//結果: int(0)
var_dump((string)false);
⑥//結果: string(0)””
var_dump((array)108);
⑦//結果: array(1){[0] => int(108)}
①と②は浮動小数点数リテラルを整数型にキャストする例。
この場合、値は四捨五入ではなくゼロの方向に丸められる。
③〜⑥は論理リテラルを数値や文字列にキャストしている。
この場合、trueは1に変換され、falseは0または空文字列に変換される。
⑦はスカラー型から配列型への変換。
この場合、数値/文字列/論理型のいずれであっても、要素をひとつだけ持つ配列ができあがる。
数値を文字列に変換する特殊な方法として、変数をダブルクォートでくくってもかまわない。
ダブルクォートのなかで変数が展開され、その結果は文字列とみなされる。
$x = 1;
var_dump(“$x”);
//結果: string(1)”1”
文字列から数値にキャスト処理を行う場合、注意すべき点がある。
具体例
<?php
var_dump((int)’0b11’);
①//結果: int(0)
var_dump((int)’0777’);
①//結果: int(777)
var_dump((int)’0xFF’);
①//結果: int(0)
var_dump(bindec(‘0b11’));
②//結果: int(3)
var_dump(octdec(‘0777’));
②//結果: int(511)
var_dump(hexdec(‘0xFF’));
②//結果: int(255)
var_dump((int)’1E4’);
③//結果: int(10000)
var_dump((floot)’1E4’);
③//結果: floot(10000)
①のように’0b11’(2進数)や’0777’(8進数)、’0xFF’(16進数)をキャストした場合、いずれも正しく認識されず、先頭から数字として認識できる箇所までを抜き出す。
よって’0b11’であれば「b」の前までを抜き出し、0となる。
‘0777’は全て数字だが、10進数と認識され、結果は777となる。
これら2/8/16進数表現の文字列を正しくキャストするには、②のような関数を利用する。
関数 | 概要 |
---|---|
bindec | 2進数を10進数に変換 |
octdec | 8進数を10進数に変換 |
hexdec | 16進数を10進数に変換 |
残る指数表現については問題ない(③)。
int/floatがた共に正しく認識できる。
11は演算子について