cakephpで開発する際に配列を組み替える便利なクラスHash

More than 1 year has passed since last update.

WithOne AdventCalendar 2日目の記事です。

ここ最近cakephpで実装することが多くなりその中で配列を組み替えることが増えたのでその時に便利なHashクラスについて簡単に説明しようと思います。
間違っている部分がありましたら指摘していただけると助かります。

Hashクラスとは

配列を組み替える上で非常に便利なクラスです。
多次元配列など複雑な配列を条件付きで組み換えや値取得を行うことができます。
使用マニュアルは下記を参照
http://book.cakephp.org/2.0/ja/core-utility-libraries/hash.html

例として使用する配列

下記のような配列を使って使用例を説明します。

$user_list = array(
    'User' => array(
        array(
            'id' => '1',
            'name' => '田中',
            'age' => '15',
            'group' => array(
                'group_id' => '1',
                'group_name' => '田中グループ'
            )
        ),
        array(
            'id' => '2',
            'name' => '山田',
            'age' => '17',
            'group' => array(
                'group_id' => '2',
                'group_name' => '山田グループ'
            )
        ),
        array(
            'id' => '3',
            'name' => '佐藤',
            'age' => '15',
            'group' => array(
                'group_id' => '3',
                'group_name' => '佐藤グループ'
            )
        ),
        array(
            'id' => '4',
            'name' => '田中',
            'age' => '16',
            'group' => array(
                'group_id' => '1',
                'group_name' => '田中グループ'
            )
        )
    )
);

基本的な使用例

例えばユーザーデータが配列として複数格納されている$user_listという配列から格納されているユーザー名のみを取得したい場合は下記の通り

$result = Hash::extract($user_list, 'User.{n}.name');

Userやnameは配列のkeyを指します。{n}は数値keyを意味します。それぞれ「.」でつないで書きます。

$resultの出力結果は下記の通りになります。

Array
(
    [0] => 田中
    [1] => 山田
    [2] => 佐藤
    [3] => 田中
)

配列の並べ替え

グループ名でグルーピングして配列のkeyをidとしてユーザー名をまとめたい場合は下記の通り

$result = Hash::combine($user_list, 'User.{n}.id', 'User.{n}.name', 'User.{n}.group.group_name');

$resultの出力結果は下記の通りになります。

Array
(
    [田中グループ] => Array
        (
            [1] => 田中
            [4] => 田中
        )

    [山田グループ] => Array
        (
            [2] => 山田
        )

    [佐藤グループ] => Array
        (
            [3] => 佐藤
        )

)

条件付き取得を行う

年齢が15歳のユーザー情報のみ取得したい場合は下記の通り

$result = Hash::extract($user_list, 'User.{n}[age=15]');

条件を指定する場合[条件をつける対象key名=条件]の形で書きます。

$resultの出力結果は下記の通りになります。

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => 田中
            [age] => 15
            [group] => Array
                (
                    [group_id] => 1
                    [group_name] => 田中グループ
                )

        )

    [1] => Array
        (
            [id] => 3
            [name] => 佐藤
            [age] => 15
            [group] => Array
                (
                    [group_id] => 3
                    [group_name] => 佐藤グループ
                )

        )

)

使用できる条件式は=、!=、>、<、>=、<=の6種です。

最後に

今回紹介したメソッドはextractとcombineだけでしたがほかにも値の追加のみを行うものや条件に合致したものだけ削除するものなどまだまだ便利な機能がたくさんあります。
今後cakephpを使用する機会がありましたら是非活用してみてください。