配列内の特定の場所に値があるかどうかを確認する関数を作成しようとしています:
function ($array, $key) {
if (isset($array[$key]) {
return true;
}
return false;
}
しかし、マルチ配列でこれを達成するにはどうすればよいですか? 値が設定されているかどうかを確認したいとします$array[test1][test2]
キーの配列を渡し、途中で見つけたオブジェクトに再帰します。
function inThere($array, $keys)
{
$key = $keys; // if a single key was passed, use that
$rest = array();
// else grab the first key in the list
if (is_array($keys))
{
$key = $keys[0];
$rest = array_slice($keys, 1);
}
if (isset($array[$key]))
{
if (count($rest) > 0)
return inThere($array[$key], $rest);
else
return true;
}
return false;
}
したがって、次の場合:
$foo = array(
'bar' => array( 'baz' => 1 )
);
inThere($foo, 'bar'); // == true
inThere($foo, array('bar')); // == true
inThere($foo, array('bar', 'baz')); // == true
inThere($foo, array('bar', 'bazX')); // == false
inThere($foo, array('barX')); // == false
出かけますが、多分これです。$keys は配列であっても配列である必要がありますが、コードを変更して、キーの配列または 1 つだけをチェックすることができます。
function array_key_isset($array, $keys) {
foreach($keys as $key) {
if(!isset($array[$key])) return false;
$array = $array[$key];
}
return true;
}
array_key_isset($array, array('test1','test2'));
より普遍的な方法がありますが、最初は奇妙に見えるかもしれません: ここでは array_walk_recursive とクロージャ関数を利用しています:
$array = array('a', 'b', array('x', 456 => 'y', 'z'));
$search = 456; // search for 456
$found = false;
array_walk_recursive($array, function ($value, $key) use ($search, &$found)
{
if ($key == $search)
$found = true;
});
if ($found == true)
echo 'got it';
唯一の欠点は、キーが既に見つかっている場合でも、すべての値を反復処理することです。ただし、これは小さな配列には適しています