- 2011-12-02 (金) 11:00
- PHP
PHP Advent Calendar jp 2011 2日目です。
はい、PHPer王子です。
前日の @cakephper さんになんだか妙な名前を付けられました が、今年も PHP Advent Calendar を実施することになりました。管理人がなぜか 2 日目という変わったスタートとなりましたが、なんとか12/25の最後日まで駆け抜けたいと思います。参加されたみなさんよろしくお願いします!
ちなみにまだ数日空きがあるので、いっちょ書いてみよーという方の参加お待ちしてます:D
PHPerにおける連想配列の悩み
王子らしくPHPerの悩みを解決したい!ということで、連想配列にまつわるお悩みを。
普段PHPを書いていて何とも悩ましいのが、array関連の関数です。PHPerなら、もう何度となく聞いたことがあるであろう「引数に統一感が無い」というやつですね。
一例をあげると、コールバック関数を受け取る array_filter, array_map, array_reduce などの関数の場合、引数として受け取るのはどれも対象の連想配列とコールバック関数の2つです。普通に考えれば、どの関数でも同じ順序で引数を受け取れば良いように思うのですが、下記のように array_filter/array_walkは第1引数が array になっているのに対して、array_map は第1引数がコールバック関数となっています。
array array_filter ( array $input [, callback $callback ] ) array array_map ( callback $callback , array $arr1 [, array $... ] ) bool array_walk ( array &$array , callback $funcname [, mixed $userdata ] )
実際のコードで書くと違和感はさらにつのります。引数が違うという点もそうですが、array_mapの無名関数の後に連想配列を指定するのがなんとも気持ち悪いですね。
arryなら!
ということでもっとシンプルに書けるように arry というライブラリを作ってみました。
これを使うとこんなにすっきりと書けます。
メソッドチェイン
各メソッドはインスタンスを返すので、メソッドチェインもできます。
実行すると以下のようになります。
200 180 160 140 120 100 80 60 40 20
メソッドチェインを繋げていく
上手く繋げて行くと、array を追加して、各配列について計算した結果を追加して、ソートして、出力する、ということが一気に書けます。
実行すると悲しき今シーズンの結果が表示されます。
1. Dragons 75 59 0.560 2. Swallows 70 59 0.543 3. Giants 71 62 0.534 4. Tigers 68 70 0.493 5. Carp 60 76 0.441 6. Baystars 47 86 0.353
キーがあるかどうか
PHPでハマりがちな isset() / array_key_exists() も exists() メソッドで指定したキーが連想配列に存在するか確認できます。
PHP5.4なら
5.4ならarray()の代わりに[]が使えるので、さらにすっきりとなります。
実はこの arry という名前は、5.4 以降では array() を使わなくだろうから、この名前にしています。今は紛らわしいですが、5.4 が当たり前になったころにはこのライブラリ以外で array() と書くことはなくなるかもしれません:D
本当はSPLで
そんな arry ですが、array系関数の代わりとして使うにはまだまだ実装が足りません。
実はこれを書いた理由は SPL でこういった実装が欲しかったからなんですね。ArrayObject もありますが、実装メソッドが少なく、完全に連想配列をメソッドで操作するというわけにはいきません。
arry を膨らませていっても良いのですが、PHP 標準の SPL でこういったクラスが欲しいですね。
さて PHP Advent Calendar jp 2011 3日目は、AWS の貴公子 @tottokug さんです。どんなネタが飛び出すか楽しみですね!
- Newer: PHP5.4 ビルトインサーバで CakePHP を試食する(CakePHP Advent Calendar 2011 4日目)
- Older: あらためてPHP5.3 – 第2回関西PHP勉強会
トラックバック:0
- このエントリーのトラックバックURL
- /blog/2011/12/php_arry.html/trackback
- Listed below are links to weblogs that reference
- PHPerの悩みを解決する arry を作ってみた(PHP Advent Calendar jp 2011 Day 2) from Shin x blog