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));
こちらの方がより実践的ですね。
コメント
おお、hiromiさんだー。
コメントありがとうございます。
確かにそちらの方が実勢的ですね!追記したいと思います。
Set::filter()は再帰的に処理されるので、
foreach (Set::filter(array($a, $b, $c)) as $target_ary) {
というほうがより実践的なプラクティスかなと思います。
Set::filter($this->data)など。