[CakePHP] 指定した複数のキーのいずれかに値が入っているか検査する

  • このエントリーをはてなブックマークに追加

Set::filterを使っているので、CakePHP限定のお手軽技。
複数の特定キーのいずれかに対してNULL以外の値が代入されているかを1文でチェックします。

array_intersect($keys, array_keys(Set::filter($target_array)));

使用例

下記に例を記します。
ここでは$keys配列で指定したキー名のいずれかがターゲットとなる配列$a、$b、$cの3つに対して走査をします。

$keys = array('key3', 'key5');

$a = array( 
    'key3' => 'hoge',
    'key5' => 'fuga'
);

$b = array(
    'key3' => 'hoge'
);

$c = array(
    'key6' => 'fuga'
);

foreach (array($a, $b, $c) as $target_ary) {
    $check = array_intersect($keys, array_keys(Set::filter($target_ary)));
    if ($check) {
        echo 'Exist values! : ', implode(',', $check);  
    } else {
        echo 'Not exist values.';
    }
    echo PHP_EOL;
}

実行結果下記のようになります。

Exist values! : key3,key5
Exist values! : key3
Not exist values. 

あんまり使わないかなぁ?


## 追記
hiromiさんよりご指摘いただいたので、追記します。
`Set::filter()`は引数の配列を再帰的に処理するので、使用例で挙げたループ内で毎回実行する必要は無く、`foreach`開始の時に一挙にやってしまう方が効率的です。
具体的には以下のような感じですね。

“`php
foreach (Set::filter(array($a, $b, $c)) as $target_ary) {
$check = array_intersect($keys, array_keys($target_ary));
“`

こちらの方がより実践的ですね。

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。




コメント

  1. たかおファン(surface) より:

    おお、hiromiさんだー。
    コメントありがとうございます。
    確かにそちらの方が実勢的ですね!追記したいと思います。

  2. hiromi より:

    Set::filter()は再帰的に処理されるので、
    foreach (Set::filter(array($a, $b, $c)) as $target_ary) {
    というほうがより実践的なプラクティスかなと思います。
    Set::filter($this->data)など。

コメントを残す