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

<font color="pink"><h2>通常配列と連想配列との混在</h2></font>

そもそも<font color="blue">通常配列</font>と<font color="red">連想配列</font>との区別はないので、これらを混在させることも可能。

例

```
<?php
$data = [‘山田’ => ‘太郎’, 15 => ‘二郎’, ‘鈴木’ => ‘三郎’, ‘四郎’];

print_r($data);

//結果:

Array
(
 [山田] => 太郎
 [15]  => 次郎
 [鈴木] => 三郎
 [16]  => 次郎
)
```

この場合も、キーを省略した場合には、「その時点での最大インデックス+1」が次のインデックスとして割り振られる。

<font color="pink"><h2>キーは整数値/文字列に変換される</h2></font>

ここまではキーとして整数、または文字列を指定してきたが、そのほかにも、任意のデータ型を指定できる。
<font color="blue">下記例</font>
ただし、整数/文字列以外のキーが指定された場合には、内部的に、整数/文字列に変換される。

```
<?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値はから文字列に変換される

ちなみに、配列やオブジェクトを、配列のキーとすることは<font color="red">できない。</font>
エラーとなるので注意。

<font color="green"><h1>型の相互変換</h1></font>

前回も述べたように、<font color="red">PHPはデータ型に関して比較的寛容な言語。</font>

データの中身から自動的に判断し、適切な入れ物（変数）を割り当ててくれるのがPHPの良いところ。

しかしそのために、ある程度本格的なコードを書き始めると、思わぬ挙動に悩まされることもある。

ここでは、データ型の<font color="blue">暗黙的な変換</font>と、<font color="red">明示的な変換（キャスト）</font>について学ぶ。

<font color="pink">暗黙的な変換</font>

PHPでは、そのときどきの状況に応じて値を適切なデータ型へ変換することで、「それぞれの文脈に応じてできるだけ何らかの処理をしよう」とする。

これを<font color="blue">型の暗黙的な変換</font>という。

たとえば前回の「数値や文字列を論理型とみなす」などの処理は典型的な暗黙的な変換であり、PHPの世界ではこのような処理が（特に演算の局面で）常時行われている。

ただし時としてその変換は明確でないことから混乱の元にもなる。

<font color="pink"><h2>明示的な変換（キャスト）</h2></font>

厳密な比較や演算をしたい場合、暗黙的な変換に頼るのは必ずしも好ましくない。

そのような場合には、<font color="red">キャスト</font>と言う仕組みを利用することで、値を特定の型に強制的に変換できる。

<font color="red">構文</font><font color="blue">キャスト</font>

```
(データ型)値
```

キャスト構文で利用できるデータ型は下記のとおり。

利用可能なキャスト型
|データ型|概要|
|:-:|:-:|
|(int)、(integer)|整数型へのキャスト|
|(bool)、(boolean)|論理型へのキャスト|
|(float)、(double)|浮動小数点型へのキャスト|
|(string)|文字列型へのキャスト|
|(binary)|バイナリ文字列型へのキャスト|
|(array)|配列へのキャスト|
|(object)|オブジェクトへのキャスト|

<font color="red">下記は具体例</font>
具体例に使われる<font color="blue">var_dump</font>は、変数（値）の情報を出力する関数。
<font color="blue">print_r関数</font>に似ているが、データ型も加味した情報を出力してくれるので、型も含めて値を確認したい場合に便利。

```
<?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)}

```

①と②は浮動小数点数リテラルを整数型にキャストする例。
この場合、<font color="red">値は四捨五入ではなくゼロの方向に丸められる。</font>

③〜⑥は論理リテラルを数値や文字列にキャストしている。
この場合、<font color="blue">trueは1に変換され、falseは0または空文字列に変換される。</font>

⑦はスカラー型から配列型への変換。
この場合、<font color="red">数値/文字列/論理型のいずれであっても、要素をひとつだけ持つ配列ができあがる。</font>

数値を文字列に変換する特殊な方法として、<font color="red">変数をダブルクォートでくくっても</font>かまわない。
ダブルクォートのなかで変数が展開され、その結果は文字列とみなされる。

```
$x = 1;

var_dump(“$x”);
//結果: string(1)”1”
```

<font color="pink"><h2>文字列→数値の型キャスト</h2></font>

文字列から数値にキャスト処理を行う場合、注意すべき点がある。

具体例

```

<?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がた共に正しく認識できる。

<font color="green">11は演算子について</font>