in_arrayのややこしい版

仕事で必要に駆られて書いてみました。

イメージとしては、タイトル通りin_arrayに複雑な条件を指定出来るようにしたもので、
第一引数の配列のネストレベルが深くなる毎に、and/orをトグルしながら検索していきます。

思い出しながらなので、こんなんだったかどうか微妙><

使い方

<?php
/* 検索条件 */
$needles = array(1, 2, array(3, array(4, 5)));

/* 検索対象を変えながらテスト */
echo in_array_ex($needles, array(1, 3, 2));	// true
echo in_array_ex($needles, array(1, 4, 2));	// false
echo in_array_ex($needles, array(4, 5, 1, 2));	// true

?>

ソースコード

<?php
function in_array_ex(Array $needles, Array $haystack, $logical_op = 1) {
	if (empty($needles)) return $logical_op;
	$needle = array_shift($needles);
	
	$tmp;
	if (is_scalar($needle)) $tmp = in_array($needle, $haystack);
	else if (is_array($needle)) $tmp = in_array_ex($needle, $haystack, !$logical_op);
	else throw new Exception(
		'The 1st argument must be an array of mixed in array, and scalar.'
	);
	
	if ($logical_op) return $tmp && in_array_ex($needles, $haystack, $logical_op);
	else return $tmp || in_array_ex($needles, $haystack, $logical_op);
}
?>

概要と使い道

眠いのでまた後日…><