PHPでarray関数の覚える順を格付けしてみた

PHPを実装する上でarray系の標準関数ってものすごく多いですよね。
自分も何を覚えるべきかわからなかったです。

そこでWEBページやAPI、バッチを作成してきたPHP歴6年のエンジニアが、
PHP公式サイトに書いてある配列関連の関数で、
個人的ここを覚えておけばOKのリストを作ってみました。
あくまで自分の経験測なのでご参考程度に。
https://www.php.net/manual/ja/ref.array.php

以下のような区分けをしています。

- [(★★★★★)いろんなところで使う！覚えておくべき関数](https://qiita.com/ono-soic/items/fa3c49dbc5647b95efda#%E3%81%84%E3%82%8D%E3%82%93%E3%81%AA%E3%81%A8%E3%81%93%E3%82%8D%E3%81%A7%E4%BD%BF%E3%81%86%E8%A6%9A%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8F%E3%81%B9%E3%81%8D%E9%96%A2%E6%95%B0)
- [(★★★★☆)知っておくとコーディングの幅が広がる関数](https://qiita.com/ono-soic/items/fa3c49dbc5647b95efda#%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8F%E3%81%A8%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E5%B9%85%E3%81%8C%E5%BA%83%E3%81%8C%E3%82%8B%E9%96%A2%E6%95%B0)
- [(★★★☆☆)心の片隅にあればいいくらいの関数](https://qiita.com/ono-soic/items/fa3c49dbc5647b95efda#%E5%BF%83%E3%81%AE%E7%89%87%E9%9A%85%E3%81%AB%E3%81%82%E3%82%8C%E3%81%B0%E3%81%84%E3%81%84%E3%81%8F%E3%82%89%E3%81%84%E3%81%AE%E9%96%A2%E6%95%B0)
- [(★★☆☆☆)個人的使ったことがないからきっと覚えなくていい関数](https://qiita.com/ono-soic/items/fa3c49dbc5647b95efda#%E5%80%8B%E4%BA%BA%E7%9A%84%E4%BD%BF%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8%E3%81%8C%E3%81%AA%E3%81%84%E3%81%8B%E3%82%89%E3%81%8D%E3%81%A3%E3%81%A8%E8%A6%9A%E3%81%88%E3%81%AA%E3%81%8F%E3%81%A6%E3%81%84%E3%81%84%E9%96%A2%E6%95%B0)
- [(★☆☆☆☆)エイリアスと非推奨関数](https://qiita.com/ono-soic/items/fa3c49dbc5647b95efda#%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9%E3%81%A8%E9%9D%9E%E6%8E%A8%E5%A5%A8%E9%96%A2%E6%95%B0)

星5と4までは自分のコメントも踏まえて紹介します。

## いろんなところで使う！覚えておくべき関数(★★★★★)
それなりの処理を実装していて頻繁に出てくる関数をピックアップします。

- **array — 配列を生成する**

array()と最初に型を定義するためのもの。関数ではない。

`$array = array();`

- **is_array — 変数が配列かどうかを検査する**
配列判定をするために必須の関数

- **explode — 文字列を文字列により分割する**
ファイル読み込みなどで改行・カンマ区切りで頻繁に使用する

- **implode — 配列要素を文字列により連結する**
explodeと同様、CSVファイルに出力するなどで頻繁に使用する

- **array_column — 入力配列から単一のカラムの値を返す**
配列から特定の要素を取得したい場面が実装上多くあるので、重宝している。
PHP5.5からしか使えないので、自社の5.5未満系には大抵これと同じ動きをする関数が実装されていた。

- **array_keys — 配列のキーすべて、あるいはその一部を返す**

- **in_array — 配列に値があるかチェックする**
in_arrayは重いとよく言われるので、使わないようにしていたが、
ハイパーループしなければ誤差レベルだと思うので最近は気にせず使用している。
以下でin_arrayを使わずに処理を行う方法など解説されている。
https://thk.kanzae.net/net/itc/t2379/

- **array_values — 配列の全ての値を返す**
純粋に値だけを取り出すために使用する事が多いが、
keyの値順序が崩れている時などにkeyを整えたりする用途で使うこともある。

- **array_diff — 配列の差を計算する**
とにかくよく使うので覚えるべし

- **array_key_exists — 指定したキーまたは添字が配列にあるかどうかを調べる**
if文でかなりお世話になる関数

- **array_merge — ひとつまたは複数の配列をマージする**
配列のマージはほぼ何かの実装で行われる。
`$array1 += $array2;`
`$array1 = array_merge($array1,$array2);`
の違いも押さえておくと良い。
http://shoyan.hatenablog.com/entry/20120402/1333380371

- **array_search — 指定した値を配列で検索し、見つかった場合に対応する最初のキーを返す**
そこまで使わないが、覚えておいた方がいいと思うのでこの枠に記載

- **array_sum — 配列の中の値の合計を計算する**

- **array_unique — 配列から重複した値を削除する**

- **count — 変数に含まれるすべての要素、 あるいはオブジェクトに含まれる何かの数を数える**
if文でハイパー頻出

- **sort — 配列をソートする**
配列をソートできる関数があることは覚えておいた方が良い。

- **array_push — 一つ以上の要素を配列の最後に追加する**
個人的には
`$array[] = 'XXX';`
で書くことが多いので意外と使う機会は少ないかも、概念として知っておくと良い

## 知っておくとコーディングの幅が広がる関数(★★★★☆)
- **array_slice — 配列の一部を展開する**
画面に表示する文字切りなどで実装する場面が出てくる

- **array_filter — コールバック関数を使用して、配列の要素をフィルタリングする**
無名関数と合わせて使用すると、綺麗なコーディングになるかもしれない。
これをスマートに書けると「PHPわかってきてるな」感が出る

- **array_map — 指定した配列の要素にコールバック関数を適用する**
こちらも無名関数と合わせて使用する機会が多い。

- **array_fill — 配列を指定した値で埋める**
ロジック問題などで使う機会が多いイメージ

- **array_merge_recursive — 一つ以上の配列を再帰的にマージする**
array_mergeは知っているが、再起的マージを知らない人が多いので、知っておいて欲しい関数である。

- **array_pad — 指定長、指定した値で配列を埋める**
スペースなどで文字数を上下で整える時に使用する事が多い。

- **array_replace — 渡された配列の要素を置き換える**

- **array_shift — 配列の先頭から要素を一つ取り出す**

- **array_unshift — 一つ以上の要素を配列の最初に加える**
array_pushとは異なり、配列の先頭に入れたいと言う場面がたまにあるので重宝する

- **array_chunk — 配列を分割する**
配列の中身が100個あるけれど、API実行時は10配列単位で渡したいなどの場合、
この関数で配列を10個ごとに分割して、一括処理をするなどの場面で使用する機会が多い。

- **asort — 連想キーと要素との関係を維持しつつ配列をソートする**

- **compact — 変数名とその値から配列を作成する**
変数の再定義が面倒な時に使用することが多い。

- **current — 配列内の現在の要素を返す**
ループ文を使用している時に意外と使うタイミングがある

- **end — 配列の内部ポインタを最終要素にセットする**

- **key — 配列からキーを取り出す**

- **ksort — 配列をキーでソートする**

- **list — 配列と同様の形式で、複数の変数への代入を行う**
変数代入でかなり重宝する関数、複数回の代入をする必要がなくなる

- **next — 配列の内部ポインタを進める**
currentと同様、ループ文内で使用する事が多い

- **range — ある範囲の整数を有する配列を作成する**
有用的な機能を作成するためというよりは、ロジック問題などで使用する機会が多い印象がある。

## 心の片隅にあればいいくらいの関数(★★★☆☆)
- **array_pop — 配列の末尾から要素を取り除く**
- **array_combine — 一方の配列をキーとして、もう一方の配列を値として、ひとつの配列を生成する**
- **array_diff_assoc — 追加された添字の確認を含めて配列の差を計算する**
- **array_fill_keys — キーを指定して、配列を値で埋める**
- **array_flip — 配列のキーと値を反転する**
- **array_intersect_assoc — 追加された添字の確認も含めて配列の共通項を確認する**
- **array_intersect_key — キーを基準にして配列の共通項を計算する**
- **array_intersect — 配列の共通項を計算する**
- **array_multisort — 複数または多次元の配列をソートする**
- **array_rand — 配列から一つ以上のキーをランダムに取得する**
- **array_reduce — コールバック関数を用いて配列を普通の値に変更することにより、配列を再帰的に減らす**
- **array_reverse — 要素を逆順にした配列を返す**
- **array_walk — 配列の全ての要素にユーザー定義の関数を適用する**
array_mapでほぼ実装できるのでこれを使う機会はあまりない**
- **prev — 内部の配列ポインタをひとつ前に戻す**
- **reset — 配列の内部ポインタを先頭の要素にセットする**
- **rsort — 配列を逆順にソートする**
- **shuffle — 配列をシャッフルする**
- **usort — ユーザー定義の比較関数を使用して、配列を値でソートする**

## 個人的使ったことがないからきっと覚えなくていい関数(★★☆☆☆)
- **array_change_key_case — 配列のすべてのキーの大文字小文字を変更する**
- **array_count_values — 配列の値の数を数える**
- **array_diff_key — キーを基準にして配列の差を計算する**
- **array_diff_uassoc — ユーザーが指定したコールバック関数を利用し、 追加された添字の確認を含めて配列の差を計算する**
- **array_diff_ukey — キーを基準にし、コールバック関数を用いて配列の差を計算する**
- **array_intersect_uassoc — 追加された添字の確認も含め、コールバック関数を用いて 配列の共通項を確認する**
- **array_intersect_ukey — キーを基準にし、コールバック関数を用いて 配列の共通項を計算する**
- **array_product — 配列の値の積を計算する**
- **array_replace_recursive — 渡された配列の要素を再帰的に置き換える**
- **array_splice — 配列の一部を削除し、他の要素で置換する**
- **array_udiff_assoc — データの比較にコールバック関数を用い、 追加された添字の確認を含めて配列の差を計算する**
- **array_udiff_uassoc — データと添字の比較にコールバック関数を用い、 追加された添字の確認を含めて配列の差を計算する**
- **array_udiff — データの比較にコールバック関数を用い、配列の差を計算する**
- **array_uintersect_assoc — データの比較にコールバック関数を用い、 追加された添字の確認も含めて配列の共通項を計算する**
- **array_uintersect_uassoc — データと添字の比較に個別のコールバック関数を用い、 追加された添字の確認も含めて配列の共通項を計算する**
- **array_uintersect — データの比較にコールバック関数を用い、配列の共通項を計算する**
- **array_walk_recursive — 配列の全ての要素に、ユーザー関数を再帰的に適用する**
- **arsort — 連想キーと要素との関係を維持しつつ配列を逆順にソートする**
- **extract — 配列からシンボルテーブルに変数をインポートする**
- **krsort — 配列をキーで逆順にソートする**
- **natcasesort — 大文字小文字を区別しない"自然順"アルゴリズムを用いて配列をソートする**
- **natsort — "自然順"アルゴリズムで配列をソートする**
- **uasort — ユーザー定義の比較関数で配列をソートし、連想インデックスを保持する**
- **uksort — ユーザー定義の比較関数を用いて、キーで配列をソートする**

## エイリアスと非推奨関数(★☆☆☆☆)
個人的にエイリアス関数は他者が確認する際に誤解を招く(可読性が低い)可能性があるので、基本的に使用しないことをおすすめします。

- **key_exists — array_key_exists のエイリアス**
- **pos — current のエイリアス**
- **sizeof — count のエイリアス**
- **each — 配列から現在のキーと値のペアを返して、カーソルを進める(非推奨関数)**