【開発】PHPの便利なarray_multisortとか

開発ざれごとarray_multisort,CSV,php,sql,ソート

sc20111203201802

最初に言っておきますが、自分はあまり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の仕様って変なの多いなぁ・・・)

sc20111203203329

 


具体的には、こんな感じになります。SQLっぽいでしょ。・・・そうか?(;^ω^)

$s_itemsが、処理対象の配列。$sort_***は、ネタ配列で、$s_itemsの列の値が入ってるだけです(ソートのネタだけなので、別に列の値じゃなくてもいいんですけどね)

ご察しのように、ネタ配列のインデックスが重要(≒処理対象のインデックス)なので、それだけ注意。普通は、列の値をそのまま入れるので問題ないでしょうけど(SQLでいうサブクエリや計算値のようなものを利用したければ、計算した結果を、そのインデックスに入れれば良い)

sc20111203204007

ネタ配列は、こんな感じで入れればいいんじゃないだろうか(CSVのファイルの例/タブ区切)

ちなみに、計算結果でソートしようとしてます。

PHPって未だに、(.Netとかと比べるのは厳しいと思うが)、あまりスマートじゃないですよね。

Perlに比べれば、多機能過ぎるので、ちょいちょいコマンド書くのに便利だが(Perl正規表現書けるし)、本気のソフトを書く気になれない。

開発ざれごとarray_multisort,CSV,php,sql,ソート

Posted by nabe