1
0

More than 1 year has passed since last update.

10: 通常配列と連想配列との混在,

Posted at

通常配列と連想配列との混在

そもそも通常配列連想配列との区別はないので、これらを混在させることも可能。

<?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は演算子について

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0