配列を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ページで、使い方や各メソッドの機能が一覧できないので、ざっと自分用リファレンス作ってみました。


追加

  1. 2/2 checkに補記/修正
  2. 2/16 isEqualにver1.3向け追記

使い方

App::importなど、追加の設定は一切必要なし。

Set::extract($str, $arr);

と書くだけ。
Controller(Component), Model(Behavior), View(Helper)全部共通。

リファレンス*1

基本

$array = array(第一階層) => array(第二階層) => array(第三階層)

第一階層.第二階層.第三階層

で指定

抽出
  1. combine
    1. 配列から、特定のキー=value になっている物を抽出
    2. 同じパターンの配列繰り返しから新たな配列作る場合に良い?
  2. diff
    1. 2つの配列の差分を抽出
    2. array_diffとの違いは「差分の元のkey」を保持できる点ぽい
  3. pushDiff
    1. 2つの配列の差分を抽出
    2. diffとの違いは、「差分の元のkey&元の親key」を保持できる・・・点か?
  4. classicExtract
    1. 配列を、複雑に検索&抽出
    2. オブジェクトにも対応OKらしい

検索・チェック系

  1. check
    1. 特定のパスがセットされているか否か
      1. issetとの違い:多階層のパスを一行でチェックできる
  1. extract
    1. 配列を検索
      1. 詳細
  1. enum
    1. 指定キーが配列に存在する場合、「そのvalue」を返す
    2. array_search()の対。
    3. Select要素と相性が良い模様
  1. matches
    1. 特定のパスが、指定条件にマッチしているか否か
  1. contains
    1. 引数がarrayで2つ。「引数2∈引数1」=true
  1. numeric
    1. 配列のvalueが、すべて数字か否かのチェック
  1. countDim
    1. 配列が、何階層になっているかを調べる
追加/削除
  1. Insert
    1. 機能は名前通り。
    2. 階層が深い場合に指定が ドット(.) 区切りでちょっと楽&コード綺麗かも
  2. remove
    1. 機能は名前通り。
    2. ホントにソレ以上、説明しようがない(汗)
      1. unsetで良いじゃん、と心の声。
      2. でもそう言うのは他にもある。
      3. Set::***() で、こんなコトもできないのー? な要求に対応してみてるのかもしれない。
  3. filter
    1. 「ルート配列から空の要素を除きます。「0」の要素は除きません。」
      1. ・・・・以上。
  1. merge
    1. 脳内要約「array_mergeやarray_merge_recursiveよりも、遠慮がちな配列マージ」
      1. 公式説明
並び替え
  1. sort
    1. 機能は名前とおり
    2. 指定した階層に、該当する配列がない場合の挙動が謎・・・

形式変換

  1. map
    1. 配列をオブジェクトに変換する
  2. reverse
    1. オブジェクトを配列に変換する
      1. reverse⇔mapで対
  1. format
    1. 配列を文字列にフォーマット
      1. 残念ながら、ver1.3のvirtualField機能で、その役目を終えそうな気配・・・
  1. normalize
    1. 配列を「正規化」する
    2. 「Set::mergeするとなんかおかしいよー」な時に使うと良い模様

謎。。

  1. isEqual
    1. 「二つのセットあるいは配列が等しいか調べます。」
    2. ==  とか === との違いは不明・・・
      1. ver1.3で非推奨になります。==か===を使いましょう。

*1:但し書きのない場合、CookBook情報ベースで判断・推測した内容です