PHP配列関数まとめ

過去記事の配列関数をまとめてみました。
～系の表記は私の造語(？)なのでもっといい感じの奴があれば教えてください！
関数名は全部マニュアルにリンクしてるので、詳細はマニュアルをどうぞ！

# 配列操作系
要素の追加や削除、置き換えなど、配列の構成を変える関数
配列の要素そのものを加工はしない。


##  [array_shift](http://php.net/manual/ja/function.array-shift.php)
```php
array_shift ( array &$array )
```
配列の先頭を切り取って返す。
返り値は配列の先頭にいた値。元の配列からはその値はなくなる。
添え字が数値だった場合は添字も振りなおされる。
元の配列から値をシフトする。

```php:array_shift
$arr = array("banana","orange","apple","peach","grape");
print_r($arr);
/*
Array
(
    [0] => banana
    [1] => orange
    [2] => apple
    [3] => peach
    [4] => grape
)
*/

$fruit = array_shift($arr);
print_r($arr);
/*
Array
(
    [0] => orange
    [1] => apple
    [2] => peach
    [3] => grape
)
*/
print_r($fruit)
// banana
```

## [array_pop](http://php.net/manual/ja/function.array-pop.php)
```php:
array_pop ( array &$array )
```
`array_shift`の最後バージョン。最後を切り取って返す。
数字なら添字も詰まるので、`array_pop`した後要素を追加した場合はその位置に入る。ポップアップとかのイメージ。なぜpullとかpickにしてくれなかったのか…。

```php:array_pop
$arr = array("banana","orange","apple","peach","grape");
print_r($arr);
/*
Array
(
    [0] => banana
    [1] => orange
    [2] => apple
    [3] => peach
    [4] => grape
)
*/

$fruit = array_pop($arr);
print_r($arr);
/*
Array
(
    [0] => banana
    [1] => orange
    [2] => apple
    [3] => peach
)
*/
print_r($fruit);
// grape

$arr[] = "mango";
print_r($arr);
/*
Array
(
    [0] => banana
    [1] => orange
    [2] => apple
    [3] => peach
    [4] => mango
)
*/
```
## [array_unshift](http://php.net/manual/ja/function.array-unshift.php)
`array_unshift ( array &$array ,"追加する値"[,"追加する値"]  )`
1つ以上の要素を配列の先頭に追加。追加する順は引数として与えた順序のまま。添字が数値なら０から振りなおされる。
shift(取り出し)の逆だからunshiftなんだろうけど…いまいちピンとこない。


```php:array_unshift
$arr = array("banana","orange","apple","peach","grape");
print_r($arr);
/*
Array
(
    [0] => banana
    [1] => orange
    [2] => apple
    [3] => peach
    [4] => grape
)
*/

array_unshift($arr,"mango","melon");
print_r($arr);
/*
Array
(
    [0] => mango
    [1] => melon
    [2] => banana
    [3] => orange
    [4] => apple
    [5] => peach
    [6] => grape
)
*/
```

## [array_push](http://php.net/manual/ja/function.array-push.php)
`array_unshift`の後ろバージョン。最後に値を追加。
`$arr[]`と動きは同じ。1個だけなら`$arr[]`の方が早い。
配列の後ろに値を押し付ける、なイメージ。

```php:array_push
$arr = array("banana","orange","apple","peach","grape");
print_r($arr);
/*
Array
(
    [0] => banana
    [1] => orange
    [2] => apple
    [3] => peach
    [4] => grape
)
*/

array_push($arr,"mango","melon");
print_r($arr);
/*
Array
(
    [0] => banana
    [1] => orange
    [2] => apple
    [3] => peach
    [4] => grape
    [5] => mango
    [6] => melon
)
*/
```


## [array_slice](http://php.net/manual/ja/function.array-slice.php)
```php
array_slice ( array $array , 開始位置 [, 個数 [, キーを維持するかどうか ]] )
```
配列の切り出し。指定された位置の配列を返す。
個数を指定しない場合は開始位置から末尾まで。
負の数の場合は末尾からの数。
元の配列はそのまま。

```php:array_slice
$arr = array("banana","orange","apple","peach","grape");
print_r($arr);
/*
Array
(
    [0] => banana
    [1] => orange
    [2] => apple
    [3] => peach
    [4] => grape
)
*/

$arr1 = array_slice($arr,2);
print_r($arr1);
/*
Array
(
    [0] => apple
    [1] => peach
    [2] => grape
)
*/
$arr2 = array_slice($arr,-2);
print_r($arr2);
/*
Array
(
    [0] => peach
    [1] => grape
)
*/
$arr3 = array_slice($arr,-4,-1);
print_r($arr3);
/*
Array
(
    [0] => orange
    [1] => apple
    [2] => peach
)
*/
$arr4 = array_slice($arr,2,-1);
print_r($arr4);
/*
Array
(
    [0] => apple
    [1] => peach
)
*/
$arr5 = array_slice($arr,2,-1,true);
print_r($arr5);
/*
Array
(
    [2] => apple
    [3] => peach
)
*/
```

## [array_splice](http://php.net/manual/ja/function.array-splice.php)
```php
array_splice ( array &$input , 削除開始位置 [, 個数[, 置き換える配列]] )
```
配列の一部を削除し、空いた部分に代わりの配列を置く。
キーは維持されない。

```php:array_splice
$arr = array("banana","orange","apple","peach","grape");
print_r($arr);
/*
Array
(
    [0] => banana
    [1] => orange
    [2] => apple
    [3] => peach
    [4] => grape
)
*/

array_splice($arr,1,3,array("mango","melon"));
print_r($arr);
/*
Array
(
    [0] => banana
    [1] => mango
    [2] => melon
    [3] => grape
)
*/
```

## [array_merge](http://php.net/manual/ja/function.array-merge.php)

```php
array array_merge ( array $array1 [, array $... ] )
```
ひとつまたは複数の配列をマージする
キーが同じ文字列の場合は__後ろの値[^mg]__で上書き 。
キーが数字の場合は0から振りなおされて値は追記される。

[^mg]: 最初の値を残したい場合は配列結合演算子＋を使う。

```php:array_merge 
$ar1 = array("color" => array("favorite" => "red"), 5);
$ar2 = array(10, "color" => array("favorite" => "green", "blue"));

print_r(array_merge_recursive($ar1, $ar2));
/*
Array
(
    [color] => Array
        (
            [favorite] => green　//$ar1["color"]["favorite"]の"red"が上書きされてなくなる
            [0] => blue　//$ar2["color"][0]の値が追記
        )

    [0] => 5　//$ar1[0]
    [1] => 10 //$ar2[0]
)
*/
```

## [array_merge_recursive](http://php.net/manual/ja/function.array-merge-recursive.php)

```php
array array_merge_recursive ( array $array1 [, array $... ] )
```
二つ以上の配列を再帰的にマージする
キーが同じ文字列の場合は一つの配列にまとめられる。
キーが数字の場合は0から振りなおされて値は追記される。

```php:array_merge_recursive 
$ar1 = array("color" => array("favorite" => "red"), 5);
$ar2 = array(10, "color" => array("favorite" => "green", "blue"));

print_r(array_merge_recursive($ar1, $ar2));
/*
Array
(
    [color] => Array
        (
            [favorite] => Array
                (
                    [0] => red     //$ar1["color"]["favorite"]
                    [1] => green   //$ar2["color"]["favorite"]
                )

            [0] => blue //$ar2["color"][0]
        )

    [0] => 5  //$ar1[0]
    [1] => 10 //$ar2[0]
)
*/
```

# 配列処理系
配列の要素そのものを足したり、ひとつひとつに処理を施したりする。

## [array_sum](http://php.net/manual/ja/function.array-sum.php)
```php:
array_sum ( array $array )
```
配列の中の値の合計を計算する

```php:array_sum
$arr = array(1,3,5,7,9);
echo array_sum($arr);
/*
25
*/
```


## [array_filter](http://php.net/manual/ja/function.array-filter.php)
```php
array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )
```

`$callback`の関数で`$array`の配列をフィルタリングし、結果がtrueの場合に`$array`の現在の値が結果の配列に入る。キーは保持。
__※コールバック関数は真偽を返すものである必要がある__

```php:array_filter
function odd($num){
  //奇数かどうかを返す
  return($num & 1);
}

function even($num){
  //偶数かどうかを返す
  return(!($num & 1));
}

$arr = [1,2,3,4,5];
print_r(array_filter($arr,"odd"));
/*
Array
(
    [0] => 1
    [2] => 3
    [4] => 5
)
*/

print_r(array_filter($arr,"even"));
/*
Array
(
    [1] => 2
    [3] => 4
)
*/

```
```php:PHP5.3以上
//PHP5.3以上なら無名関数がつかえる
$arr = array("banana","orange",2,"apple","peach","grape",6);
print_r($arr);
/*
Array
(
    [0] => banana
    [1] => orange
    [2] => 2
    [3] => apple
    [4] => peach
    [5] => grape
    [6] => 6
)
*/
$arr1 = array_filter($arr, function($val){ return is_string($val); });
print_r($arr1);
/*
Array
(
    [0] => banana
    [1] => orange
    [3] => apple
    [4] => peach
    [5] => grape
)
*/
```

## [array_map](http://php.net/manual/ja/function.array-map.php)

```php
array array_map ( callable $callback , array $array1 [, array $array2…] )
```

`$array1` の各要素に `$callback`の関数を適用した後、 その全ての要素を含む配列を返す。__`array_map`に渡される配列の数と、`$callback`が受け付けるパラメータの数は一致している必要がある。__

2つ以上の配列を使う時、配列の長さは等しい必要がある。
もし長さが違った場合は、短い方を空の要素で埋めて、長い方に合わせる。

```php:array_map
function en($n,$m){
    return ($n."は英語で【".$m."】です。");
}

function fr($n,$m){
    return ($n."はフランス語で【".$m."】です。");
}

$arr1 = [1,2,3,4,5,6];
$arr2 = ["one","two","three","four","five","six"];
$arr3 = ["un","deux","trois","quatre","cinq"];

print_r(array_map("en",$arr1,$arr2));
/*
Array
(
    [0] => 1は英語で【one】です。
    [1] => 2は英語で【two】です。
    [2] => 3は英語で【three】です。
    [3] => 4は英語で【four】です。
    [4] => 5は英語で【five】です。
    [5] => 6は英語で【six】です。
)
*/

print_r(array_map("fr",$arr1,$arr3));
/*
Array
(
    [0] => 1はフランス語で【un】です。
    [1] => 2はフランス語で【deux】です。
    [2] => 3はフランス語で【trois】です。
    [3] => 4はフランス語で【quatre】です。
    [4] => 5はフランス語で【cinq】です。
    [5] => 6はフランス語で【】です。//$arr3の要素は5つしかないので【】の中は空になる
)
*/
```
### 配列の配列を生成
コールバック関数の名前としてNULLを用いることで配列の配列を構築することができる[^zip]

[^zip]: Pythonとかだとzip関数というものがあるらしい

```php:array_map
print_r(array_map(null,$arr1,$arr2,$arr3));

/*
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => one
            [2] => un
        )
    [1] => Array
        (
            [0] => 2
            [1] => two
            [2] => deux
        )
    [2] => Array
        (
            [0] => 3
            [1] => three
            [2] => trois
        )
    [3] => Array
        (
            [0] => 4
            [1] => four
            [2] => quatre
        )
    [4] => Array
        (
            [0] => 5
            [1] => five
            [2] => cinq
        )
    [5] => Array
        (
            [0] => 6
            [1] => six
            [2] => 
        )
)
*/
```

# 元記事
[配列関数](http://qiita.com/ao_love/items/6cb7b9b6a956c173ca95)
[配列操作](http://qiita.com/ao_love/items/09276a712ea881988df2)