コーディングテスト頻出の内部関数 まとめ（その３ - 配列処理関数）[PHP]


## この記事の目的
未経験エンジニアが転職活動をする際、最初の難関となるのがコーディングテストです。ここを突破しないと面接にすら進めません。
極度のプレッシャーの中、素早く正確に問題を解くためには、**「自分が使っている言語にどのような内部関数があるのか」「どうやって使うのか」など**を事前に把握しておくことが必須と言えます。

そこで、コーディングテスト頻出の内部関数の使い方を、使用例を交えてわかりやすく正確にまとめることにしました。
本記事では、**配列処理のための内部関数**のみを取り上げます。その他の内部関数については、現在に別記事として執筆中です。
（※言語は全てPHPになります）

<br>


##  はじめに
早速ですが、本記事に登場する関数の一覧です。全部で17個の関数を取り上げます。
```
1.  implode		    配列要素を任意の文字列で連結する

2.  array_push      & 配列の末尾に要素を追加する
3.  array_pop       & 配列の末尾から要素を１つ取り除く
4.  array_unshift   & 配列の先頭に要素を追加する
5.  array_shift     & 配列の先頭から要素を１つ取り除く
6.  array_merge     ひとつまたは複数の配列をマージする
7.  unset           & 変数または配列の要素を削除する

8.  array_slice     配列の一部を切り取った配列を返す
9.  array_splice    &  配列の一部を削除し、他の要素で置換する

10. array_reverse   要素を逆順にした配列を返す
11. sort            & 配列を値の昇順にソートする
12. rsort           & 配列を値の降順にソートする
13. ksort           & 配列をキーの昇順にソートする
14. krsort          & 配列をキーの降順にソートする

15. in_array        配列に値があるかチェックする（返り値はboolean）
16. array_search    指定した値を配列で検索し、見つかった場合に対応する最初のキーを返す
17. array_keys      配列の全てのキー、または一部のキーを返す（ヒットした全てのキーを配列で返す）
```

<br>


## 本題
それでは、１つずつ順に解説していきます。
<br>

### 1. implode : 配列要素を任意の文字列で連結する
![スクリーンショット 2024-04-04 21.43.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/81162ca6-ba90-9e13-9a12-5b9daabdfbb7.png)
![スクリーンショット 2024-04-04 21.43.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/ad0213d0-8c1a-cbc1-9cdc-671f92d470b2.png)
```php
// 使用例
$array = ['lastname', 'email', 'phone'];

var_dump(implode(",", $array));     // string(20) "lastname,email,phone"

// 空の配列を使うと空文字列となる
var_dump(implode('hello', []));     // string(0) ""

// 第１引数 $separator を省略した場合は空文字で連結する 
var_dump(implode(['a', 'b', 'c']));  // string(3) "abc"
```


<br>

### 2. array_push : & 配列の末尾に要素を追加する
![スクリーンショット 2024-04-05 2.17.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/5a31c68d-b811-56bc-ef5a-bc13f1ae0134.png)
```php
// 使用例
$stack = array("orange", "banana");
array_push($stack, "apple", "raspberry");

print_r($stack);
// 出力結果は以下の通り
// Array
// (
//     [0] => orange
//     [1] => banana
//     [2] => apple
//     [3] => raspberry
// )
```

::: note warn
第１引数 `$array`は**参照渡し**なので注意。
:::
::: note warn
**戻り値**
**処理後の配列の中の要素の数**を返す。
:::
::: note warn
もし配列にひとつの要素を加えるために array_push() を使用するなら、 関数を呼ぶオーバーヘッドがないので、
　$array[] = 
を使用するほうが良い。
:::

<br>



### 3. array_pop : & 配列の末尾から要素を１つ取り除く
![スクリーンショット 2024-04-05 2.25.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/a08a8c9b-f701-aa7c-6724-aabd4f3263a3.png)
```php
// 使用例
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = array_pop($stack);
echo $fruit;  // raspberry

print_r($stack);
// 出力結果は以下の通り
// Array
// (
//     [0] => orange
//     [1] => banana
//     [2] => apple
// )
```
::: note warn
第１引数 `$array`は**参照渡し**なので注意。
:::
::: note warn
**戻り値**
**取り除いた配列要素の値**を返す。
:::

<br>

### 4. array_unshift : & 配列の先頭に要素を追加する
![スクリーンショット 2024-04-05 2.34.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/09295eb4-a3a6-c73f-275b-adcf32ecf8ca.png)
```php
// 使用例
$queue = [
    "orange",
    "banana"
];

array_unshift($queue, "apple", "raspberry");

var_dump($queue);
// 出力結果は以下の通り
// array(4) {
//   [0] =>
//   string(5) "apple"
//   [1] =>
//   string(9) "raspberry"
//   [2] =>
//   string(6) "orange"
//   [3] =>
//   string(6) "banana"
// }
```

::: note warn
第１引数 `$array`は**参照渡し**なので注意。
:::
::: note warn
**戻り値**
**処理後の配列の中の要素の数**を返す。
:::

<br>


### 5. array_shift : & 配列の先頭から要素を１つ取り除く
![スクリーンショット 2024-04-05 2.38.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/3c403ee1-df26-f7d2-16d1-61124132917d.png)
```php
// 使用例
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = array_shift($stack);
echo $fruit;  // orange

print_r($stack);
// 出力結果は以下の通り
// Array
// (
//     [0] => banana
//     [1] => apple
//     [2] => raspberry
// )
```

::: note warn
第１引数 `$array`は**参照渡し**なので注意。
:::
::: note warn
**戻り値**
**取り除いた配列要素の値**を返す。
:::

<br>

### 6. array_merge : ひとつまたは複数の配列をマージする
![スクリーンショット 2024-04-05 2.46.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/841ed8e0-91cc-1fbd-fccb-c3d485dc73ed.png)

```php
// 使用例
$array1 = array("color" => "red", 2, 4);
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2);

print_r($result);
// 出力結果は以下の通り
// Array
// (
//     [color] => green   // "green"で上書きされる
//     [0] => 2
//     [1] => 4
//     [2] => a
//     [3] => b
//     [shape] => trapezoid
//     [4] => 4
// )
```

::: note warn
二番目の配列の要素を最初の配列に追加したい (最初の配列に存在する要素は上書きせず、添字も変更しない) 場合は、配列結合演算子 + を使用すること。
```php
$array1 = array(0 => 'zero_a', 2 => 'two_a', 3 => 'three_a');
$array2 = array(1 => 'one_b', 3 => 'three_b', 4 => 'four_b');
$result = $array1 + $array2;

var_dump($result);
// 出力結果は以下の通り
// 両方の配列に同じキーが存在する場合は最初の配列のものが残り、 二番目の配列の内容は無視される
// array(5) {
//   [0]=>
//   string(6) "zero_a"
//   [2]=>
//   string(5) "two_a"
//   [3]=>
//   string(7) "three_a"
//   [1]=>
//   string(5) "one_b"
//   [4]=>
//   string(6) "four_b"
// }
```
:::

<br>

### 7. unset : & 変数または配列の要素を削除する
![スクリーンショット 2024-04-05 2.55.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/5ce8d2bb-8ddf-2c98-acb8-9649e7bb57cb.png)
```php
// 使用例
// 配列の要素の一つを破棄する
unset($bar['foo']);
```

<br>

### 8. array_slice : 配列の一部を切り取った配列を返す
![スクリーンショット 2024-04-05 3.02.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/4a6eb7f5-f114-4c59-f528-bc7791d8ed17.png)
```php
// 使用例
$input = array("a", "b", "c", "d", "e");

$output = array_slice($input, 2);      // "c", "d", "e" を返す
$output = array_slice($input, -2, 1);  // "d" を返す
$output = array_slice($input, 0, 3);   // "a", "b", "c" を返す
```
::: note warn
**第４引数 `$preserve_keys` について**
array_slice() はデフォルトで配列の数値キーを並べなおし、 リセットする。
しかし、preserve_keys を true にする事でこの動作を変更することができ、 文字列のキーはこのパラメータの値にかかわらず保存されるようになる。
```php
$input = array("a", "b", "c", "d", "e");

// 配列キーの違いに注意
print_r(array_slice($input, 2, -1));
// Array
// (
//     [0] => c
//     [1] => d
// )
print_r(array_slice($input, 2, -1, true));  // 第４引数に true を渡す
// Array
// (
//     [2] => c
//     [3] => d
// )
```
:::

<br>

### 9. array_splice : &  配列の一部を削除し、他の要素で置換する
![スクリーンショット 2024-04-05 3.15.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/645c2d1e-e56b-6c31-c5cf-c3793979d731.png)
```php
// 使用例1
// これは「置換」を行う
$input = array("red", "green", "blue", "yellow");
array_splice($input, -1, 1, array("black", "maroon"));

var_dump($input);
// array(5) {
//   [0]=>
//   string(3) "red"
//   [1]=>
//   string(5) "green"
//   [2]=>
//   string(4) "blue"
//   [3]=>
//   string(5) "black"
//   [4]=>
//   string(6) "maroon"
// }
```
```php
// 使用例2
// これは「挿入」を行う
$input = array("red", "green", "blue", "yellow");
array_splice($input, count($input), 0, array("black", "maroon"));

var_dump($input);
// array(6) {
//   [0]=>
//   string(3) "red"
//   [1]=>
//   string(5) "green"
//   [2]=>
//   string(4) "blue"
//   [3]=>
//   string(6) "yellow"
//   [4]=>
//   string(5) "black"
//   [5]=>
//   string(6) "maroon"
// }
```
```php
// 使用例3
// これは「削除」を行う
$input = array("red", "green", "blue", "yellow");
array_splice($input, 2);

var_dump($input);
// array(2) {
//   [0]=>
//   string(3) "red"
//   [1]=>
//   string(5) "green"
// }
```

::: note info
**ポイント**
array_splice() は、基本的には「置換」を行う。
ただし、`$length` = 0 の場合は「挿入」を行う。
`$replacement` が省略された場合は「削除」を行う。
:::
::: note warn
第１引数 `$array`は**参照渡し**なので注意。
:::
::: note warn
配列の数値添字は保存されないので注意。（※ 文字列添字は保存される）
:::

<br>

### 10. array_reverse : 要素を逆順にした配列を返す
![スクリーンショット 2024-04-05 5.41.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/9ab510b1-42d5-a836-8710-a41dc9a0d967.png)
```php
// 使用例
$input  = ['first', 'second', 'third'];
$reversed = array_reverse($input);
$preserved = array_reverse($input, true);

print_r($reversed);
// Array
// (
//     [0] => third
//     [1] => second
//     [2] => first
// )
print_r($preserved);
// Array
// (
//     [2] => third
//     [1] => second
//     [0] => first
// )
```
<br>

### 11. sort : & 配列を値の昇順にソートする
![スクリーンショット 2024-04-05 5.49.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/075970ba-2c37-ca2d-2536-76d7b2c1df71.png)
```php
// 使用例
$fruits = array("lemon", "orange", "banana", "apple");
sort($fruits);   // アルファベットの昇順にソート

foreach ($fruits as $key => $val) {
    echo "fruits[" . $key . "] = " . $val . "\n";
}
// 出力結果は以下の通り
// fruits[0] = apple
// fruits[1] = banana
// fruits[2] = lemon
// fruits[3] = orange
```
::: note warn
第１引数 `$array`は**参照渡し**なので注意。
:::
::: note warn
比較結果が等しくなる二つの要素があった場合、それらの並び順は保持される。
:::
::: note warn
**戻り値**
戻り値は常に true 。
:::
::: note alert
sort() を使用すると、配列のキー情報は全て削除され、新しいキーが割り当てられる。
連想配列のキーを保持したい場合は、代わりに **asort()** を使用する。
:::

<br>

### 12. rsort : & 配列を値の降順にソートする
![スクリーンショット 2024-04-05 5.53.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/9c5dc3c8-1fc8-4760-118f-788703af1fb3.png)
```php
// 使用例
$fruits = array("lemon", "orange", "banana", "apple");
sort($fruits);   // アルファベットの昇順にソート

foreach ($fruits as $key => $val) {
    echo "fruits[" . $key . "] = " . $val . "\n";
}
// 出力結果は以下の通り
// fruits[0] = orange
// fruits[1] = lemon
// fruits[2] = banana
// fruits[3] = apple
```
::: note warn
第１引数 `$array`は**参照渡し**なので注意。
:::
::: note warn
比較結果が等しくなる二つの要素があった場合、それらの並び順は保持される。
:::
::: note warn
**戻り値**
戻り値は常に true 。
:::
::: note alert
sort() を使用すると、配列のキー情報は全て削除され、新しいキーが割り当てられる。
連想配列のキーを保持したい場合は、代わりに **arsort()** を使用する。
:::

<br>

### 13. ksort : & 配列をキーの昇順にソートする
![スクリーンショット 2024-04-05 6.01.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/56384112-2059-d4d6-e811-6f9d31e415d5.png)
```php
// 使用例
$fruits = array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
ksort($fruits);

foreach ($fruits as $key => $val) {
    echo "$key = $val\n";
}
// 出力結果は以下の通り
// a = orange
// b = banana
// c = apple
// d = lemon
```
::: note warn
第１引数 `$array`は**参照渡し**なので注意。
:::
::: note warn
**戻り値**
戻り値は常に true 。
:::

<br>

### 14. krsort : & 配列をキーの降順にソートする
![スクリーンショット 2024-04-05 6.03.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/567639a2-0f0f-6d1a-f6c4-6260934aa9d3.png)
```php
// 使用例
$fruits = array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
krsort($fruits);

foreach ($fruits as $key => $val) {
    echo "$key = $val\n";
}
// 出力結果は以下の通り
// d = lemon
// c = apple
// b = banana
// a = orange
```
::: note warn
第１引数 `$array`は**参照渡し**なので注意。
:::
::: note warn
**戻り値**
戻り値は常に true 。
:::

<br>


### 15. in_array : 配列に値があるかチェックする（返り値はboolean）
![スクリーンショット 2024-04-05 6.07.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/3f0a3b5c-0821-595b-f321-c6d4a20db0bf.png)
```php
// 使用例
$os = array("Mac", "NT", "Irix", "Linux");
if (in_array("Irix", $os)) {
    echo "Got Irix";   // 出力される
}
if (in_array("mac", $os)) {
    echo "Got mac";    // 大文字小文字が区別されるので、出力されない
}
```
::: note warn
第１引数 `$needle` が文字列の場合、 比較の際に大文字小文字は区別される。
:::

<br>

### 16. array_search : 指定した値を配列で検索し、見つかった場合に対応する最初のキーを返す
![スクリーンショット 2024-04-05 6.10.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/b8c5017e-f92e-4967-37c1-0dd89ef06c1a.png)

```php
// 使用例
$array = array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red');

$key = array_search('green', $array); // $key = 2;
$key = array_search('red', $array);   // $key = 1;
```
::: note warn
第１引数 `$needle` が文字列の場合、 比較の際に大文字小文字は区別される。
:::
::: note warn
**戻り値**
`$needle` が見つかった場合、見つかった最初の配列キーを返す。 見つからなかった場合、 false を返す。
:::

<br>

### 17. array_keys : 配列の全てのキー、または一部のキーを返す（ヒットした全てのキーを配列で返す）
![スクリーンショット 2024-04-05 6.15.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/c7b52a19-7c87-52de-c1c4-adb877eeca50.png)
```php
// 使用例1
$array = array(0 => 100, "color" => "red");

print_r(array_keys($array));  // 全てのキーを返す
// 出力結果は以下の通り
// Array
// (
//     [0] => 0
//     [1] => color
// )
```
```php
// 使用例2
$array = array("blue", "red", "green", "blue", "blue");

print_r(array_keys($array, "blue"));  // 指定した値のキーのみ返す
// 出力結果は以下の通り
// Array
// (
//     [0] => 0
//     [1] => 3
//     [2] => 4
// )
```
```php
// 使用例3
$array = array("color" => array("blue", "red", "green"),
               "size"  => array("small", "medium", "large"));
               
print_r(array_keys($array));
// 出力結果は以下の通り
// Array
// (
//     [0] => color
//     [1] => size
// )
```

<br>

---

以上になります。
コーディングテストに頻出の内部関数について知っておくことは、スピーディに問題を解くために必要不可欠です。
今回紹介した5個の内部関数をしっかり覚えておきましょう！

別記事にて「文字列処理関数」「数値処理関数」についても解説してますので、そちらも参考にして下さい！

https://qiita.com/Sho-taro/items/07be3180149560ae6e2b

https://qiita.com/Sho-taro/items/a104a1bdcfa06ed3bb4a