下面的函数接受一个数组并检查其键和值是否与指定的数据类型匹配。
我似乎对之前工作的内部 lambda 函数遇到了一些问题。我正在运行 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 in
第226行
警告:call_user_func() 需要
参数1是一个有效的回调,否
第 226 行给出的数组或字符串
$keytest 和 $valtest 值去了哪里?即使我像这样将它们声明为全局的,为什么它们在 lambda 函数中还是空的?
$fn_vfail=function($v){
global $valtest;
return call_user_func($valtest,$v);
};