принятое решение (на момент написания) jwueller
function in_array_r($needle, $haystack, $strict = false) {
foreach ($haystack as $item) {
if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
return true;
}
}
return false;
}
Отличноправильно, но может иметь непреднамеренное поведение при слабом сравнении (параметр $strict = false
).
Из-за жонглирования типа PHP при сравнении значений разных типов
"example" == 0
и
0 == "example"
Оценивает true
, потому что "example"
приведен к int
и превращен в 0
.
(См. Почему PHP считает 0 равнымstring? )
Если это нежелательное поведение , может быть удобно привести числовые значения к строке перед выполнением нестрогого сравнения:
function in_array_r($needle, $haystack, $strict = false) {
foreach ($haystack as $item) {
if( ! $strict && is_string( $needle ) && ( is_float( $item ) || is_int( $item ) ) ) {
$item = (string)$item;
}
if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
return true;
}
}
return false;
}