[CakePHP] ネスト構造の配列を簡単に扱う方法 Set::extract()

CakePHPには配列を扱うメソッドであるSetが用意されています。
ネスト構造の配列を簡略化して扱うことができるので、覚えておくと役に立ちます。foreachで回して新しい変数に入れ直して・・・という処理を行わなくてよくなったりします。
CakeBookでSetについて見てみましょう。
Set
このクラスは配列の管理をし、正しく使えば、よりスマートで、最適化されたコードを作るのにとても強力で便利なツールとなります。 CakePHPは、上記を可能にする非常に便利な静的ユーティリティ郡をSetクラスで提供します。CakePHPのSetクラスはどのモデルやコントローラからも、Inflectorを呼ぶのと同じ方法で呼び出すことができます。 例: Set::combine()
今回はSetの中でも配列の一部を取り出す Set::extract()メソッドを使ってみます。
Set::extract()メソッドの使い方
書式はシンプルで引数は2つです。
Set::extract()は第一引数に「配列のパス」、第二引数に「配列」を指定します。
Set::extract()の具体的な使い方
例1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$users = array( array( 'User' => array( 'id' => 1, 'name' =>'太郎' ), ), array( 'User' => array( 'id' => 2, 'name' =>'花子' ), ), array( 'User' => array( 'id' => 3, 'name' =>'次郎' ), ), ); |
1 |
$arr = Set::extract('/User/id', $users); |
1 2 3 4 5 6 |
Array ( [0] => 1 [1] => 2 [2] => 3 ) |
例2
1 2 3 4 5 6 7 8 9 10 11 |
$data = array( 'Post' => array( 'id' => 1, ), 'User' => array( 'id' => 3, ), 'Tag' => array( 'id' => 5, ), ); |
1 |
$arr= Set::extract('{.+?}.id', $data); |
1 2 3 4 5 6 |
Array ( [Post] => 1 [User] => 3 [Tag] => 5 ) |
implode関数と一緒に使う
PHPのメソッドimplode()は配列の要素を文字列によって連結します。この関数と組み合わせるとSet::extract()で取得した配列を文字列(カンマ区切り)などに変換することができます。
1 |
$str=implode(', ', Set::extract('/User/name', $data))); |
Setメソッド一覧
CakePHPで配列を処理するとき、Setメソッドを探してみると、PHPで行っていた処理が簡単になるかもしれません。
メソッド | 意味 | 戻り値の型 |
---|---|---|
Set::apply($path, $array, $callback, $options = array()) | Set::extract互換のパスで展開された配列の要素にコールバックを適用 | mixed |
Set::check($data, $path = null) | 特定のパスが配列にセットされているか調査。$pathがからのときは$dataをそのまま返す。$pathがあるときは真偽値を返す。 | boolean/array |
Set::extract($path, $data = null, $options = array()) | 配列やオブジェクトから、配列のパス記法で与えられたパスに含まれる値を返す。 | array |
Set::combine($data, $path1 = null, $path2 = null, $groupPath = null) | $path1 で指定されたパスをキーに、そしてオプションで $path2 で指定されたパスを値に、連想配列を作成 | array |
Set::contains($val1, $val2 = null) | 一つの配列が、もう片方の配列のキーと値を正確に含んでいるかを確認 | boolean |
Set::countDim($array = null, $all = false, $count = 0) | 配列の次元の数を返す。 | integer |
Set::diff($val1, $val2 = null) | 二つの配列の間の差分を計算 | array |
Set::enum($select, $list = null) | 配列のリストから、キーが存在するものの値を返す。 | string |
Set::filter($var) | ルート配列から空の要素を除く。「0」の要素は除かない。 | array |
Set::flatten($data, $separator = '.') | 多次元配列を1次元配列に変換。 | array |
Set::format($data, $format, $keys) | 配列から、文字列にフォーマットしたものを抜粋 | array |
Set::insert($list, $path, $data = null) | $path で定義された配列の中に $data を挿入 | array |
Set::map($class = 'stdClass', $tmp = 'stdClass') | Setオブジェクトのコンテンツを、数値添字をオブジェクトの配列として保ちながら、ひとつのオブジェクトにマッピング | object |
Set::matches($conditions, $data = array(), $i = null, $length = null) | 単一のアイテムあるいは与えられた XPath が、ある条件にマッチするか確認。 | boolean |
Set::merge($arr1, $arr2 = null) | PHP の array_merge と array_merge_recursive を混ぜ合わせたもの | array |
Set::nest($data, $options = array()) | フラットな配列を引数にとり、ネストされた配列を返す。 | array |
Set::normalize($list, $assoc = true, $sep = ', ', $trim = true) | 文字列や配列のリストを正規化 | array |
Set::numeric($array=null) | 配列の全ての値が数字かどうかチェック | boolean |
Set::pushDiff($array1, $array2) | 二つの配列を統合し、戻り値の配列の最後に array2 の差分を追加 | array |
Set::remove($list, $path = null) | セットや配列の中のから、$pathで定義されたパスの要素を削除 | array |
Set::reverse($object) | Set::reverse は基本的に Set::map の逆を行い、オブジェクトを配列に変換。 | array |
Set::sort($data, $path, $dir) | パスで確定したあらゆる値で配列をソート | array |
※その他、配列を扱うには下記のメソッドが用意されています。
Hash::get(array $data, string $path)
Hash::extract(array $data, string $path)
Hash::combine(array $data, string $path, string $path)関連記事
- [CakePHP] 独自SQLのAS句で新しいフィールドを作りCakePHPの形式でデータを出力する方法
- [CakePHP] 複数レコードを一括保存するsaveAllの使い方
- [CakePHP] Cookieの使い方
- [CakePHP] 別のコントローラにあるアクションを利用する方法
- [Laravel] DBから取得したデータの中身を簡単に見る方法