【開発】PHPの便利なarray_multisortとか
最初に言っておきますが、自分はあまりPHPとかライトウェイト言語を信用しきってないタイプです(でも、Perlだけは特別だったり・・?)
なので、PHP言語仕様を完全に理解してません。
んで、オブジェクト志向とはかけ離れた、便利な関数群が大量に利用可能なPHPで、とても優秀な配列ソート関数があったのでご紹介。
SQLなら一発なんだけどな・・とお嘆きの方に、CSVファイルなんかを、手っ取り早くソートしたい時とかにかなり便利なのが、array_multisortです。
列でソート、しかも2重3重に優先ソート処理も掛けられます。
しかし、残念な事に、マニュアル(ヘルプ)を見てもイマイチ分からないんです。ググっても、なんか良く分からない。これも、多機能であるが所以のシロモノのようです。
書き方は、
array_multisort(ソートネタ配列,ソート順とか,対象配列);
戻り値は、エラーtrue/falseです(他にも書き方はあるが、割愛)赤字の部分は、いくらでも続けて書ける多項関数です。
見て分かるように、IN/OUTが同じ変数になってしまいます。
理解するととても単純な関数なんです。ソートネタ配列には、対象配列と同じ数の要素が必用で、これを元に、対象配列を並べ替えをやってるだけなんです。
SORT_ASC – 昇順にソート
SORT_DESC – 降順にソート
SORT_REGULAR – 普通に比較
SORT_NUMERIC – 数値的に比較
SORT_STRING – 文字列として比較
ソート順指定には、上記のものを必要なだけ、引数として与えます。OR論理和とかじゃなく、普通に引数を連続で渡します・・・(PHPの仕様って変なの多いなぁ・・・)
具体的には、こんな感じになります。SQLっぽいでしょ。・・・そうか?(;^ω^)
$s_itemsが、処理対象の配列。$sort_***は、ネタ配列で、$s_itemsの列の値が入ってるだけです(ソートのネタだけなので、別に列の値じゃなくてもいいんですけどね)
ご察しのように、ネタ配列のインデックスが重要(≒処理対象のインデックス)なので、それだけ注意。普通は、列の値をそのまま入れるので問題ないでしょうけど(SQLでいうサブクエリや計算値のようなものを利用したければ、計算した結果を、そのインデックスに入れれば良い)
ネタ配列は、こんな感じで入れればいいんじゃないだろうか(CSVのファイルの例/タブ区切)
ちなみに、計算結果でソートしようとしてます。
PHPって未だに、(.Netとかと比べるのは厳しいと思うが)、あまりスマートじゃないですよね。
Perlに比べれば、多機能過ぎるので、ちょいちょいコマンド書くのに便利だが(Perl正規表現書けるし)、本気のソフトを書く気になれない。