BookmarkLINEPHPでWEBアプリケーションを構築していくにあたり配列の操作は必要不可欠ですが、配列を扱う関数はたくさんあり、それら個々の処理内容も微妙な違いであったり、引数によって処理ががらりと変わったりと、わかりにくいものや、便利なのにたくさんあるからこそ埋もれてしまっている関数もたくさんあります。今回は、PHPで配列操作を行う関数を見ていきます。今回のデモはPHP7.2で行っていますが、紹介しているものは基本的に全てのバージョンで使用できる関数です。使用できるバージョンが限定的な場合はセクション毎にアナウンスします。rangerange関数は、指定した範囲で値を生成し配列として格納します。)第一引数に範囲の開始値、第二引数に範囲の終了値を渡します。オプションで第三引数にステップを指定できます。ステップを渡すと、指定範囲内をステップで刻んで値を生成します。12後者の例、オプションを指定した場合は数値が3刻みで生成されている事が確認できます。数値だけでなく文字列の生成も行えます。'x'渡した文字列が複数ある場合は、最初の文字列のみを使って範囲を生成します。ちなみにrange関数は日本語には使えません。countcount関数は、指定した配列が保持する値の数を返します。)第一引数にカウントする配列を渡します。オプションで第二引数にカウント処理方式を指定できます。sizeof()関数はcount()のエイリアスです。8オプションに関してですが、設定値は以下になります。COUNT_NORMALデフォルト。再帰的に配列をカウントする。連想配列などを子も含めカウントしたい場合は処理方式を切り替える事でカウントが可能になります。12count関数について一点、注意すべき点があります。countableではない型を渡すとE_WARNINGが発生するようになりました。ただの結果セットコレクション(オブジェクト)を渡すとエラーが出ます。count関数ではスカラー変数は扱えないのは以前からの仕様として、扱う事の出来る形式は、以下になります。7.2へアップグレードした際に上手くアプリケーションが走らない場合は意外とここでつまづいている事もあるので、アップグレード前に確認しておく事をお勧めします。array_padarray_pad関数は、指定した配列に対して、指定サイズになるまで指定範囲値でインデックスを埋めます。)第一引数には対象となる配列を、第二引数には拡充する配列のサイズを、第三引数には配列を埋める値のセットを渡します。第二引数に渡す値は、正の数で後ろ埋めとなり、負の数を渡すと前埋めになります。)埋めた値には0からの数値インデックスが振られます。この規則は一貫されるので、例えば文字列キーを持つ配列を渡すと以下のようになります。)キーが混在してよくわからない感じになるのであまりおすすめできません。ちなみに、一回の処理で追加可能な要素の最大数は1048576個になります。listlist()は、対象配列を指定変数へアタッチします。)引数にはアタッチする為の変数を必要分渡します。'Python'また、アタッチは配列の値を引数で指定した変数へ順に行われるので、カンマのみで変数の指定を省く事で、不要なアタッチは行われません。変数へアタッチしたい値を制御する事が出来ます。2つ目はスキップします。'Python'尚、対象配列と指定変数それぞれの指定数が異なった場合、指定変数の方が多ければ余った変数にはnullがセットされ、少ない場合は残りの値のアタッチはスキップされます。指定変数の方が数が多い場合はnullがセットされます。指定変数の方が数が少ない場合は、残りの値のアタッチがスキップされます。'MySQL'ちなみに、list()は、PHP7.0までは文字列キーの場合は動作しません。nullPHP7.1以降は、以下のようにする事で、文字列キーの場合でも取り出せるようになりました。3.7一つ注意点として、list()はPHP5系と7系で挙動が違います。5系では対象配列に対して逆順でアタッチされていましたが、PHP7になり配列にセットされている順にアタッチされるようになりました。)list()は、厳密には関数ではありません。array()と同じ言語構造という扱いになります。ちなみにPHP7.1より、配列の短縮構文を用いてlist()と同じように配列の値を取り出す事ができるようになっています。ZendFrameworkarray_slicearray_slice関数は、対象配列から指定範囲の値を取得します。)第一引数に対象配列を、第二引数に取得する範囲の開始インデックス番号を渡します。オプションとして、第三引数には「開始インデックスから何個取得するか」を、第四引数にはキー処理方式を指定できます。)取得した配列はキーが振り直されますが、第四引数にtrueをセットすればキーの振り直しは行われなくなります。)尚、array_slice()で対象配列内の要素を取得する際はコピーされるので、対象配列から要素は削除されません。array_chunkarray_chunk関数は、対象配列を指定数に分割します。)第一引数に対象となる配列を、第二引数には分割数を渡します。オプションで第三引数にキー処理方式を渡せます。)//)また、対象配列が文字列キーの場合はインデックスキーに振り直されます。これを保持する為には、オプションである第三引数にtrueを渡します。)////)array_keysarray_keys関数は、対象配列のキーを取得します。)第一引数に対象配列を渡します。オプションとして、第二引数に取得対象となる値、第三引数に型比較の是非を渡せます。empty(空配列)array_valuesarray_values関数は、配列の全value値を返します。)引数は一つだけ、対象となる配列を渡します。222array_combinearray_combine関数は、2つの配列から一つのkey-valueを持つ配列を作成します。PHP7で使用できます。)第一引数にkeyとする配列を、第二引数にvalueとする配列を渡します。MIT//)array_key_existsarray_key_exists関数は、対象配列に対して、指定したキーが配列に存在するかどうかを返します。)第一引数に調べるキーを、第二引数には調査する配列を渡します。falsearray_key_exists関数では、あくまでも「そのキー自体が存在するか」を返すので、value値がどうであれ、キー自体が存在すればtrueを返します。isset()やempty()などとは本質的に判定対象が違う事を理解する必要があります。array_splicearray_splice関数は、対象配列について、指定範囲を取り出し、置換を行います。)第一引数に対象配列を、第二引数に取り出す開始インデックス番号を渡します。オプションとして、第三引数に取り出す範囲の値を、第四引数には置換する値を渡せます。111取り出した部分を新しい値で埋めます。5値の追加のみを行う場合は、第三引数に0を渡します。8extractextract関数は、対象配列の値をキーに対応した配列へアタッチします。)第一引数に対象の配列を渡します。オプションで第二引数に無効、もしくは衝突時の処理を定義する定数をセットできます。第三引数には、第二引数にセットする定数によって接頭辞を渡せます。3.7尚、extract関数は、デフォルトでは文字列キーの配列のみに動作します。数値キーを持つ配列の場合、処理は行われません。0数値キーを持つ配列に適用させるには、定数EXTR_PREFIX_INVALIDをセットし、接頭辞を渡します。2既に同名の変数がある場合、デフォルトでは上書きされます。'DEF'定数EXTR_SKIPをセットすると、衝突があった場合に上書きは行われません。'def'処理時に全ての変数に接頭辞を付与する事も出来ます。する事で、予め衝突を防ぐ事が出来ます。'def'extract関数でセットできる定数は以下の通りです。EXTR_OVERWRITE衝突時は上書きされます。EXTR_SKIP衝突時は上書きされません。EXTR_PREFIX_SAME衝突時は第三引数でセットした接頭辞が付与されます。EXTR_PREFIX_ALLアタッチする全ての変数に接頭辞が付与されます。EXTR_PREFIX_INVALID数値キーの場合に接頭辞を付与します。EXTR_PREFIX_IF_EXISTS同じ変数だけどプレフィックスをつけていない変数が現在のシンボルテーブルに存在する場合にのみ変数を生成します。EXTR_REFS変数を参照で展開します。compactcompact関数は、任意の数の対象変数名から1つの配列を作成します。)1つにまとめる対象の変数名を列挙していきます。)//)array_walkarray_walk関数は、対象配列に対して一律で定義した関数を適用させます。)第一引数に対象配列を、第二引数には適用させる関数名を渡します。10また、オプションで第三引数に任意のパラメータを渡す事が出来ます。国名:アメリカコールバック関数では、第一引数に配列から取り出される1つの値、第二引数には配列のキー、第三引数に任意のパラメータが渡ります。複数の値を渡したい場合は第三引数にも配列で渡すと好きなだけ任意のパラメータを渡せます。35array_reducearray_reduce関数は、対象配列に対して、指定した関数を適用させその結果を返します。適用させる関数名を渡します。配列の文字列を全て結合します。配列から取り出される1つの値が渡ります。array_reduce()のオプションとして第三引数に初期値を渡す事が出来ます。25第三引数を渡した場合には、コールバックの結果変数に初期値として入ります。in_arrayin_array関数は、対象配列に対して、指定の値が存在するかを返します。)第一引数にチェックしたい値を、第二引数に対象配列を渡します。オプションで第三引数に型比較を行うかを渡せます。デフォルトはfalseで型比較は行いません。falsein_array関数では、検索用のインデックスを自動で作成するので、手動でループして検索を行うよりもこちらの方が高速です。array_searcharray_search関数は、対象配列に対して指定値で検索を行い、見つかった場合はその値のキーを返します。)第一引数に検索する値を、第二引数には対象配列を渡します。オプションとして第三引数に型比較を行うかを渡せます。デフォルトはfalseで型比較は行われません。falsearray_sumarray_sum関数は、対象配列中の数値を全て加算し合計を返します。)引数には合算する配列を渡します。配列内の値は、数字であれば数値型ではなく文字列型でも動作しますが、文字列の場合はスキップされます。0array_mergearray_merge関数は、対象の配列同士をマージします。)引数には、マージしたい配列を渡します。2つ以上でも渡せます。)キーが数値インデックスの場合、同じキーがあったとしても早く渡した方のキーが優先され、後からマージされた配列のキーは新たに振り直されます。文字列型のキーの場合で同じキーがある場合は、後からマージされたものが先にマージしたものを上書きします。)array_diffarray_diff関数は、対象配列に対して、指定配列に存在しない値の集合を返します。)第一配列には差分を抽出する対象の配列を、第二引数以降には差分を抽出する為にぶつける配列を渡します。);第一引数の配列に対して、第二引数以降の配列達に無いvalue値のみが返されます。キーは振り直されません。)差分が無い場合は、空の配列が返ります。()また、1つ注意点として、array_diff()は、数値型を文字列型へキャストしてから比較を行います。以下のような場合は、差分は無いと判定されます。()比較処理は以下のフォーマットで行われます。$elem2array_filterarray_filter関数は、対象配列に対してコールバック関数を適用し、内容をフィルタ処理します。)第一引数にフィルタリングを行う配列を、第二引数にコールバック関数名を渡します。オプションで第三引数に、コールバック関数へ送る配列の形式を設定できます。)array_filter関数の第二引数はオプション扱いになっており、第一引数のみでも動作します。その場合は、配列の値がfalse判定となる値がフィルタリングされます。)また、PHP5.6から第三引数へ定数を渡す事でコールバック関数へ渡す対象配列の形を指定できます。ARRAY_FILTER_USE_KEYコールバック関数へキーを渡すARRAY_FILTER_USE_BOTHコールバック関数へキーと値を渡す第三引数を指定しない場合は、値がコールバック関数へ渡されます。)array_uniquearray_unique関数は、対象配列の値から重複を除去します。)第一引数に対象配列を渡します。オプションで比較処理方式を指定できます。)第二引数オプションには、以下の定数が渡せます。)また、array_unique()とarray_merge()を用いる事で、和集合演算を行う事が出来ます。19array_intersectarray_intersect関数は、対象配列同士の共通項を取り出します。いわゆる、積集合演算を行う事が出来ます。)引数に配列を渡しますが、2つ以上でも渡せます。15array_pusharray_push関数は、対象配列の末尾に要素を追加します。)第一引数に追加対象配列を、第二引数以降に追加する要素を渡します。'ZendFramework'array_poparray_pop関数は、対象配列の末尾の要素を除去します。)引数には操作対象の配列のみを渡しますが、参照渡しになるので、結果配列を引数で受け取らなくてもグローバル側へ自動で適用されます。'cakePHP'array_shiftarray_shift関数は、対象配列の先頭から要素を1つ取り出します。)引数に操作対象配列を取ります。配列は参照渡しとなるためグローバル変数側も先頭の要素が除去された状態となります。返り値は、取り出された要素が返されます。'ZendFramework'array_unshiftarray_unshift関数は、対象配列の先頭に要素を追加します。)第一引数に追加対象配列を、第二引数以降に追加する要素を列挙します。'ZendFramework'まとめ配列処理を行う場合には、ループで回してそれぞれ処理していく事も出来ますが、それを関数に渡すだけで高速に処理してくれたり、手動では難しい厳密な比較を行ってくれたりと、PHPの配列操作関数には便利なものがたくさん揃っています。これらを知っているといないとでは、WEBアプリケーション構築のスピードや堅牢性もかなり変わってくるので、是非試してみてください。イベントレポート2019.12.8MySQL8.0.16で追加されたCHECK制約を試してみる。2019.12.2LaravelのContracts(契約)とは。SESを使ってAPIメール送信を行う(Mailableクラス&SimpleEmailService)2019.12.3MySQL8.0.16で追加されたCHECK制約を試してみる。RitoLaboこのサイトについて利用規約プライバシーポリシ。