PHP5技術者認定試験(上級)に学ぶ、実は知らなかった配列関数(3)

# PHP5技術者認定試験（上級）

資格試験に向けて勉強中です
勉強していて、PHPについて実は知らなかった／勘違いしていたことを記載します。

今回もほとんどが関数のざっくり解説になっています。

こんな配列関数もあるんだーと、新しい発見に繋がれば幸いです。

## 配列

- **インデックス配列** と **連想配列** があります。
- キーに指定できるのは、整数と文字列のみ

- 可能ならば整数に変換される
	- 浮動小数点 `123.12` の場合、小数点を切り捨てた整数 `123` に変換される
	- 10進数に変換可能な文字列 `"123"` は、整数 `123` に変換される
	- 10進数に変換できない `"0123"` は、文字列 `"0123"` のまま

## 関数

|関数|機能|
|---|---|
|count( `$var` )|要素数を取得|
|sizeof( `$var` )|**上に同じく** 要素数を取得|
|array_pad( `$input, $size, $value` )|sizeの長さに達するまで、valueを末尾に継ぎ足す。 **負の値を指定すると先頭に追加する** |

## 配列の展開

|関数|機能|
|---|---|
|list( `$v1, $v2, ...` ) = `$array` |arrayの要素を変数v1, v2に格納する。 **余った変数には NULL** がセットされる。|
|array_slice( `$array, $start, $len` )|分割。startからlenの数を取り出した配列を返す|
|array_chunk( `$array, $size` )|分割。size数ごとの塊にする。（1次元配列は2次元になる）|
|array_splice( `&$array, $start, [$len, [$replace]]` )|削除。 **参照渡し** 。 startからlen数分の要素を削除。replaceを指定子た場合は、削除した場所にそれを挿入。|


- `list() = $array` の構文は違和感のかたまり

## キーや値の操作

- `isset($array[$key])` は、 **キーが存在しても、値がNULLの場合はfalseを返す** 。
	- `array_key_exsists($key, $array)` を使おう
- `array_search()` は最初に見つかったkeyのみ返す

`in_array()` はPHPの良心

## 変数の展開

- 文字列内で２次元配列を展開する場合は波括弧で括る必要あり。
	- `echo "値は {$array[0][0]}"`

|関数|機能|
|---|---|
|extract( `&$array [, $option, $prefix] ` ) |キーと値を、変数名と値として、そのスコープに展開する。変態向けの関数。|
|compact( `$value` )|変数名と値を、キーと値とした配列を返す。同じく変態向け。|

- compact()は、 引数が配列の場合は、 値の文字列がキーとなる
- extract()は、 変数名の接頭辞を指定可能
	- この関数を使う人とは友達になりたくない

## 順次処理

- `foreach($array as $key => $val)` は、 **配列のコピーを作成してから処理を行う** ため、ループ中に要素数を変更しても変わらず処理する

### イテレータ

|関数|機能|
|---|---|
|key( `&$array` )|イテレータが指す要素のキーを返す|
|current( `&$array` )|イテレータが指す要素の値を返す|
|each( `&$array` )|イテレータが指す要素の **キーと値を配列にして** 返す。イテレータを次へ移動|
|next( `&$array` )|イテレータを次へ移動し、その値を返す|
|prev( `&$array` )|イテレータを前へ移動し、その値を返す|
|end( `&$array` )|イテレータを末尾へ移動し、その値を返す|
|reset( `&$array` )|イテレータを先頭へ移動し、その値を返す|

- いつかもし current() を使うときには `list($key, $val) = current($array)` としたいと思った。

## 要素に対する関数

|関数|機能|
|---|---|
|array_walk( `&$array, $funcname[, $callbackの第三引数]` )|それぞれの要素に関数を実行|
|array_map( `$callback,  $array1 [, $array2, ...] ` )|callbackの実行結果を配列にして返す。array1は第一引数の集合、array2は第二引数の集合|
|array_sum( `$array` )|値の和|
|array_product( `$array` )|値の積|
|array_reduce( `$array,  $callback [, $初期値] ` )|全部合計するとかができる（説明放棄）|

## ソート

### シンプルなもの

|関数|機能|
|---|---|
|sort( `&$array` ), rsort( `&$array` )|昇順/降順ソート。キーが振り直される。|
|asort( `&$array` ), arsort( `&$array` )|値でソート。キーはそのまま。|
|ksort( `&$array` ), krsort( `&$array` )|キーでソート。キーはそのまま。|
|usort( `&$array, $callback` )|ユーザー定義関数でソート。キーは振り直される。|
|uasort( `&$array, $callback` )|ユーザー定義関数（引数は値）でソート。キーはそのまま。|
|uksort( `&$array, $callback` )|ユーザー定義関数（引数はキー）でソート。キーはそのまま。|
|natsort( `&$array` )|自然順ソート。キーが振り直される。|
|natcasesort( `&$array` )|自然順ソート（大文字小文字を区別しない）。キーが振り直される。|

### 他

|関数|機能|
|---|---|
| array_multisort( `&$array1, &$array2` )| array1の順に合わせて array2の順も変わる|
|array_reverse( `&$array` ) |逆順に並べ替える|
|array_flip( `&$array` ) |キーと値を入れ替える|
|shuffle( `&$array` ) |ランダムに並べ替え。キーが振り直される。|

- array_multisort()の optionは `SORT_ASC` `SORT_DESC` など

## 演算

|関数|機能|
|---|---|
|array_merge( `$array1, $array2` )|マージ|
|array_diff( `$array1, $array2` )|差分を集めた配列を返す|
|array_fillter( `$array1, $funcname` )|関数の結果がtrueのものを配列にして返す。 **キーはそのまま** |
|array_unique( `$array` )|重複を削除。 **キーはそのまま** |
|array_intersect( `$array1, $array2` )|重複のみを返す逆diff。 **キーはそのまま** |

## 追加と削除

|関数|機能|
|---|---|
| array_unshift( `&$array, $val` ) |先頭に追加|
| array_shift( `&$array` ) |先頭を削除|
| array_push( `&$array, $val` ) |末尾に追加|
| array_pop( `&$array` ) |末尾を削除|

そこはかとなく js っぽさを感じる

## 他のtips

### キーを指定しない場合 1

```php
$arr = [];
$arr["qiita"] = "a";
$arr[] = "b";
$arr[] = "c";
```

上記の場合 [ "qiita" => "a", **0** => "b", **1** => "c" ] となる


### キーを指定しない場合 2

```php
$arr = [];
$arr[] = "a";
$arr[3] = "b";
$arr[] = "c";
```

上記の場合 [ 0 => "a", 3 => "b", **4** => "c" ] となる

整数添字は最大数をインクリメントしていくんですね。

## 終わりに

PHPの配列関数、痒いところに手が届くものもあれば
コンパイル言語使用者が見たら吐き気を催すものまでありますね…。

いいね！頂けると勉強が捗ります。

- [第1回 関数](http://qiita.com/tmak_tsukamoto/items/84f7d62f6106fad5fd23)
- [第2回 文字列](http://qiita.com/tmak_tsukamoto/items/41673ab2d6fedeef0980)
- [第3回 配列](http://qiita.com/tmak_tsukamoto/items/2eb6d10e83b6c00981c9)