BookmarkLINEPHPには、配列をソートする(並び替える)為の関数がたくさん存在しています。今回はそれらの微妙な違いを確認しながら、配列を並び替える関数を一通り見ていきます。usort()は、それぞれを値を基準として並び替えを行います。valueの、valueの事です。sortsort関数は、対象配列を昇順にソートします。)第一引数には対象配列を渡します。オプションで第二引数にソート処理方式を指定する為の定数を渡せます。)昇順に並び替えられたのと一緒に、キー(添え字)が振り直されます。ソート系関数は、インデックスが振り直されるかどうかにも注目すると、それらの違いを理解しやすいです。ちなみにオプションの第二引数には、以下の定数を渡せます。組み合わせ(ビットOR演算子でつなぐ)で用いられます以下ではオプションに定数を渡し、文字列としての比較でソートを行っています。)以下は大文字小文字の区別無しとして文字列としての比較でソートを行っています。)両者でソート結果が違う事が確認できます。rsortrsort関数は、sort関数の逆で対象配列を降順にソートします。)引数はsort関数と同じです。)rsort()も、キーは振り直されます。usortusort関数は、ユーザ定義関数を用いて対象配列を値でソートします。)第一引数に対象配列を、第二引数にコールバック関数名を渡します。6コールバック関数は引数を最大2つまで取り、それぞれ、現在の値と、その次の値が渡ります。例として実装したascendingOrder関数は、昇順ソートの為の基本的な比較アルゴリズムです。usort()の場合も、キーは振り直される事が確認できます。asort/arsort/uasortasort系関数も、sort系関数と同じく値を軸として並び替えを行いますが、sort系関数との違いは、「キーを維持する」点です。asortasort関数は、キーと値を維持しつつ、配列を値を軸に昇順でソートします。);第二引数にはsort関数と同じ定数をオプションとして指定できます。sort()と同じく第一引数は参照で渡るので、戻り値を改めて受け取ったりする必要はありません。6上記の通り、キー(添え字)を保ったままソートされている事が確認できます。これは、キーが文字列、連想配列の場合に力を発揮します。キーは維持されるarsortarsort関数は、asort()の逆で、値を降順でソートします。こちらもキーは維持されます。引数はasort()と同じです。'aaa'uasortuasort関数は、キーを維持した状態で値をユーザー定義関数で並び替えます。);第一引数に配列(こちらも参照で渡されるため、戻り値を受け取る必要はありません)を、第二引数に関数名を渡します。以下は、基本的な降順アルゴリズムを定義したユーザ定義関数で並び変えています。'aaa'ksort/krsort/uksortksort系関数は、キーを軸として並び替えを行います。こちらも、キーは維持されます。ksortksort関数は、配列のキーを軸に昇順で並び替えます。);こちらも同じく、第一引数に配列を渡し、第二引数にはオプションでソート挙動を変更する定数を渡せます。3キーを軸として昇順に並び替えられている事が確認できます。krsortkrsort関数はksort()の逆です。キーを軸として、降順でソートを行います。2キーを軸に降順でソートされている事が確認できます。uksortuksort関数は、ユーザ定義関数を用いて、キーを軸に配列を並び替えます。);第一引数に配列を、第二引数に関数名を渡します。ついて、ユーザ定義関数を定義する事で任意の並び替えを行う事が出来ると紹介しましたが、定義する関数には一定のルールが存在します。ユーザ定義関数には配列内の2つの値(uksort()の場合はキー)が渡されてくるので、それらの比較を行い、以下の基準に従って値を返す必要があります。コードとして登場していますが、例としては以下のような形になります。}}引数に2つの値が渡ってくると紹介しましたが、具体的に何が渡ってくるのかと言うと、「配列の値」です。これらが順番でぐるぐると渡され(総当たりではありません)互いに比較され、全ての配列の値の順番が確定されます。数値を比較するだけなら別にユーザ定義関数でソートしなくても良い。いう事になり、それよりも一歩踏み込んだ比較でソートを行いたい場合などに用いる事で力を発揮します。以下のようなソートを行いたい場合などは、ユーザ定義関数でのソートが力を発揮します。10usort()を用いて昇順でのソートを行いますが、とにかく5だけは優先して先頭に持っていきたい!という、(ちょっと普通じゃ絶対やらないような例ですが)こういうイレギュラーなソートを行ったりできるのも、ユーザ定義関数を用いてこそ行える事です。数値だけではなく、文字列の比較も行えるので、使い方は無限大です。あとは単純な比較だけではなく、引数の文字列から正規表現などで数値部分を抜き出してそれをソートの基準にしたりなど、発想次第でいくらでも定義する事が出来ます。ユーザ定義関数を用いたソートは、こんな風にして使用されます。natsort/natcasesortnatsort系関数は、自然順アルゴリズムを用いて配列をソートします。natsortnatsort関数は、自然順アルゴリズムで配列をソートします。);自然順アルゴリズムとは、自然数を数的な順序で並び替えを行う比較アルゴリズムです。例を見るとわかりやすいです。'a_15.php'上記のように、自然順アルゴリズムを用いる事で自然数順で並び替えを行う事が出来ます。natcasesortnatcasesort関数は、挙動はnatsortと同じですが、こちらは大文字と小文字を区別せずにソートを行います。'A_15.php'natsort関数の場合はまず「A」と「a」が比較されるため、接尾辞の自然数は順番にはなりませんが、natcasesortは大文字小文字を区別しないので、自然数順に並びます。array_multisortarray_multisort関数は、複数の配列に対して一度にソートを行います。省略可能・デフォルト=SORT_ASC)を、第三引数に挙動を変更する定数(sort関数と同じ)設定(省略可能・デフォルトはSORT_REGULAR)できます。第四引数以降には、2つ目以降の配列を任意の数だけセットする事が出来ます。2ここで一つ注意点があります。変数$bの結果を確認すると、昇順で並んでいない事がわかります。このarray_multisort関数は、渡した全ての配列をそれぞれ昇順・降順でソートするわけではなく、主たる配列、つまりは最初に渡した配列の並び替え結果に応じて、それと同じ並び替えを2つめ以降の配列に適用するものになります。以下のようにするとイメージしやすいでしょう。4並び替え対象の主たる配列である配列$aにおいて、3番目を先頭に、4番目を2番目に、1番目を3番目に、2番目を4番目へ移動する事で昇順に並べ替えていますが、2つ目以降である配列$bに対しても、同じ移動方式で並べ替えを行っています。それを見越してソート前の配列を意図的に並べ替えておいたので、ソートを適用させた結果、変数$bも綺麗に昇順に並べ替えられています。見方によってはかなり中途半端な挙動をするこの関数は、どのような状況下で使えるのかというと、例えば以下のようなケースで力を発揮します。'Tokyo'変数$aには国名が、変数$bには首都名が格納されており、それぞれの配列の位置が対になっています。これは一例ですが、こういった、バラバラになっているが本来であればペアである配列同士をずれる事なく並べ替えを行えるのも、この関数の使えるところでもあります。array_reversearray_reverse関数は、配列を逆順に並び替えた配列を返します。);第一引数に配列を、第二引数にはオプションキーを保持するかどうかを真偽値で渡します。デフォルトはfalse(キーを保持しない=振り直される)です。第二引数を省略するとデフォルトでfalseがセットされ、キーは振り直されます。trueを渡すとキーは維持されます。'Japan'array_fliparray_flip関数は、配列のキーと値を反転させます。);キーと値をそっくり入れ替えるのがこの関数の特徴です。France//)元の配列はキーが国、値が首都でしたが、反対になっている事が確認できます。shuffleshuffle関数は、配列をランダムに並び替えます。);引数に渡す配列は参照扱いになるので、戻り値をキャッチしなくても配列内はシャッフルされます。6ちなみにこの関数はキーを振り直すので、文字列キーを持つ配列を渡す場合などは注意が必要です。D.C.'まとめこのように、配列をソートする関数はたくさんありますが、それぞれの特徴を掴み、違いを理解することで、数のわりにケースによって使うべき関数は限定される事がわかると思います。古くからあるこのレガシーな関数たちは、これからもずっとPHPの機能となり続けるでしょう。SESを使ってAPIメール送信を行う(Mailableクラス&SimpleEmailService)2019.12.3MySQL8.0.16で追加されたCHECK制約を試してみる。RitoLaboこのサイトについて利用規約プライバシーポリシ。