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開始の時に一挙にやってしまう方が効率的です。
具体的には以下のような感じですね。

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

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

スポンサーリンク
管理人

システムえんじにゃー🐈
趣味はエレキギターなど。作曲したい。
WoWs/プリコネ
記事に関する質問はお気軽にどうぞ。

surface0 (さーふぇす)をフォローする
surface0 (さーふぇす)をフォローする

コメント

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

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

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