【CakePHP】Hash::extractで多次元配列から任意の値の配列を作成する

プログラミング全般
スポンサーリンク

はじめに

今回は以下のような多次元配列から、任意の値の配列を楽に作成する方法を解説させていただきます。
CakePHPのHash::extractを使用することで、foreachなどを使用せず1行で記述することが可能になります!

// 以下の配列からnameの値だけを取得して、['ぼく', 'ねこ']の配列を作成します。
$data = [
    [
        'id' => 1,
        'name' => 'ぼく',
        'age' => 21
    ],
    [
        'id' => 2,
        'name' => 'ねこ',
        'age' => 19
    ],
];

この記事を見るメリット

  • 多次元配列から任意の値の配列を作成する方法が分かる
  • Hash::extractの使用方法の理解

対象者

この記事は下記のような人を対象にしています。

  • プログラミング初学者
  • 駆け出しエンジニア
  • CakePHP学習者
  • なるべく1行で処理を書きたい方

結論

以下のコードで楽に任意の値の配列を作成することができます。

Hash::extract($data, '{n}.name');

// 出力結果
['ぼく', 'ねこ']

解説

ここから先ほどのコードについて解説させtいただきます。

Hash::extractについて

Hash::extractは配列から特定の要素だけを取り出して 新たな配列にすることができます。
第一引数: 元となる配列
第二引数: 取得したいデータのキー

{n}とは?

ここで初めて見た方は「この{n}とは何?」となると思います。
結論を言うと、{n}を記述すると全ての文字列キー全ての数値型のキーと一致すると言う意味となり、全ての配列に対して処理を実行すると言う意味になります。

ちなみに、CakePHPのHashクラスのパス構文になり、他にも知りたい方はこちらを見ると{n}以外のパス構文についての詳細も確認することができます。

まとめ

先ほど2つの記述の解説をまとめると、Hash::extractで指定したキーの配列を作成する際に、{n}で全ての配列で検索をかけて新しい配列を作成することができます。

応用1:キーでなく特定の値のみで絞り込みをかけたい場合

配列のキーで指定した場合は、全てのキーの値の配列が作成されてしまいます。
では、特定のキーと値を指定して値を取得したい場合はどうするのでしょうか?

以下の配列から、name = ねこのみを取得するコードになります。

$data = [
    [
        'id' => 1,
        'name' => 'ぼく',
    'age' => 21
    ],
    [
        'id' => 2,
        'name' => 'ねこ',
    'age' => 19
    ],
];

// 配列ないから、nameがねこのみを取得する
Hash::extract($data, '{n}[name=ねこ].name');

// 出力結果
['ねこ']

応用2: 配列の階層が深い場合のキーの指定方法

また、以下のように階層が深い配列の値を指定する方法も紹介させていただきます。

$data = [
    [
        [
            'id' => 1,
            'name' => 'ぼく',
        'age' => 21
        ],
    ...
    ],
    [
         [
            'id' => 2,
            'name' => 'ねこ',
        'age' => 19
        ],
    ...
    ]
];

// {n}.{n}で連結させると深い配列でも対応可能
Hash::extract($data, '{n}.{n}.name');

// 出力結果
['ぼく', 'ねこ']

おわりに

今回はHash::extractを使用して、任意の値の配列を作成する方法を解説させていただきました。
CakePHPにもLaravelのように便利なヘルパ関数があるので、知っていると開発が楽になりますね!

最後まで記事を見てくださりありがとうございました。


公式リファレンスの参考リンク:

Hash - 3.10

タイトルとURLをコピーしました