Следующая функция берет массив и проверяет, соответствуют ли его ключи и значения указанным типам данных.
Кажется, у меня есть некоторые проблемы с внутренними лямбда-функциями, которые ранее работали. Я использую PHP v5.3.6. Они в последний раз работали под v5.3.4. Они жалуются, что непропущенная переменная не находится в области видимости. Если я переформулирую эту переменную как global
, то ошибка исчезнет, но переменная будет пустой.
/**
* @param array $arr, array to be tested
* @param mixed $keytype
* @param mixed $valuetype
* @example acceptable_arr( array(1,2,3,4,'string'), NULL, 'integer') returns false
* @example acceptable_arr( array('thing'=>1,'other'=>2), 'string', 'integer') returns true
* @example acceptable_arr( array('thing'=>1,'other'=>2), 'string', 'array') returns false
*/
function acceptable_arr(array $arr,$keytype=NULL,$valuetype=NULL){
print_r(func_get_args()); //debugging
$valfail=true; $keyfail=true;
if($keytype==NULL && $valuetype==NULL) return true;
if(!is_null($keytype)) {
$keytest='is_'.$keytype;
if(function_exists($keytest)){
$fn_kfail=function($v){return call_user_func($keytest,$v);}; //PROBLEM LINE 218
$keyfail=(!is_null($keytype)) ? array_sum(array_map($fn_kfail,array_keys($arr))) : false;
}
}
if(!is_null($valuetype)) {
$valtest='is_'.$valuetype;
if(function_exists($valtest)){
$fn_vfail=function($v){return call_user_func($valtest,$v);}; //PROBLEM LINE 226
$valfail=(!is_null($valuetype)) ? array_sum(array_map($fn_vfail,$arr)) : false;
}
}
return !($valfail && $keyfail);
}
Запуск вышеуказанной функции выводит это:
Array
(
[0] => Array
(
[0] => main
)
[1] => integer
[2] => string
)
Примечание: неопределенная переменная: keytest in
линия 218
Предупреждение: call_user_func () ожидает
параметр 1, чтобы быть действительным обратным вызовом, нет
массив или строка в строке 218
Примечание: неопределенная переменная: valtest в
линия 226
Предупреждение: call_user_func () ожидает
параметр 1, чтобы быть действительным обратным вызовом, нет
массив или строка в строке 226
Куда делись значения $ keytest и $ valtest? Почему они пусты внутри лямбда-функций, даже если я объявляю их глобальными, как это?
$fn_vfail=function($v){
global $valtest;
return call_user_func($valtest,$v);
};