配列をSet::で操作する
Modelから取得したデータ配列を更に検索&抽出する必要が生じましたが、array_searchなどで対応できる範疇を超えていました。
これは独自に関数作らないとダメかなあ、と思いつつtwitterで
arrayをSQLのようにサーチしたい。 WHERE public_flag=true AND created > 2010-01-01 みたいな・・・
とつぶやいたら、kaz_29さんからReplyで、Setライブラリの存在を教えていただきました。
http://book.cakephp.org/ja/view/640/Set
どうやら、Set::extractの組み合わせで目的達成出来そうです。
こんなものがあったとは、CakePHP奥が深い・・・
SetのTOPページで、使い方や各メソッドの機能が一覧できないので、ざっと自分用リファレンス作ってみました。
追加
- 2/2 checkに補記/修正
- 2/16 isEqualにver1.3向け追記
使い方
App::importなど、追加の設定は一切必要なし。
Set::extract($str, $arr);
と書くだけ。
Controller(Component), Model(Behavior), View(Helper)全部共通。
リファレンス*1
基本
$array = array(第一階層) => array(第二階層) => array(第三階層)
↓
第一階層.第二階層.第三階層
で指定
抽出
- combine
- 配列から、特定のキー=value になっている物を抽出
- 同じパターンの配列繰り返しから新たな配列作る場合に良い?
- diff
- 2つの配列の差分を抽出
- array_diffとの違いは「差分の元のkey」を保持できる点ぽい
- pushDiff
- 2つの配列の差分を抽出
- diffとの違いは、「差分の元のkey&元の親key」を保持できる・・・点か?
- classicExtract
- 配列を、複雑に検索&抽出
- オブジェクトにも対応OKらしい
検索・チェック系
- check
- 特定のパスがセットされているか否か
- issetとの違い:多階層のパスを一行でチェックできる
- 特定のパスがセットされているか否か
- extract
- 配列を検索
- matches
- 特定のパスが、指定条件にマッチしているか否か
- contains
- 引数がarrayで2つ。「引数2∈引数1」=true
- numeric
- 配列のvalueが、すべて数字か否かのチェック
- countDim
- 配列が、何階層になっているかを調べる
追加/削除
- Insert
- 機能は名前通り。
- 階層が深い場合に指定が ドット(.) 区切りでちょっと楽&コード綺麗かも
- remove
- 機能は名前通り。
- ホントにソレ以上、説明しようがない(汗)
- unsetで良いじゃん、と心の声。
- でもそう言うのは他にもある。
- Set::***() で、こんなコトもできないのー? な要求に対応してみてるのかもしれない。
- filter
- 「ルート配列から空の要素を除きます。「0」の要素は除きません。」
- ・・・・以上。
- 「ルート配列から空の要素を除きます。「0」の要素は除きません。」
- merge
- 脳内要約「array_mergeやarray_merge_recursiveよりも、遠慮がちな配列マージ」
並び替え
- sort
- 機能は名前とおり
- 指定した階層に、該当する配列がない場合の挙動が謎・・・
形式変換
- map
- 配列をオブジェクトに変換する
- reverse
- オブジェクトを配列に変換する
- reverse⇔mapで対
- オブジェクトを配列に変換する
- format
- 配列を文字列にフォーマット
- 残念ながら、ver1.3のvirtualField機能で、その役目を終えそうな気配・・・
- 配列を文字列にフォーマット
- normalize
- 配列を「正規化」する
- 「Set::mergeするとなんかおかしいよー」な時に使うと良い模様
謎。。
- isEqual
- 「二つのセットあるいは配列が等しいか調べます。」
- == とか === との違いは不明・・・
- ver1.3で非推奨になります。==か===を使いましょう。
*1:但し書きのない場合、CookBook情報ベースで判断・推測した内容です