PHP:虽然版本5.3之前不能用匿名函数,但还是有其他方法的
PHP 5.3才引入匿名函数,因为有很多变化,一些服务器死活不敢去更新版本,而 create_function() 只能帮个小忙,对于有多个变量的函数就不行了。后来在StackOverflow上面得到启发,用上了创建 class 的方法解决问题。
下列示例中的 $SearchResults 是一个数组,通过 array_filter 进行筛选,保留 key 或 value 中包含关键词 $SEARCH 的项目。
行不通的方法
// 因为参数的局限,没有办法提供更多参数
function filter($a,$SEARCH) {
return (stripos($a,$SEARCH)!==false);
}
$SearchResults=array_filter($SearchResults,'filter');
// 或者
$filter = create_function('$a,$SEARCH', 'return (stripos($a,$SEARCH)!==false);');
$SearchResults=array_filter($SearchResults,$filter($a,$SEARCH));
// 只有一个参数就可以:
$filter = create_function('$a', 'return (stripos($a,"foo")!==false);');
$SearchResults=array_filter($SearchResults,$filter);
简便的匿名函数方法
// 需要 PHP >=5.3
$SearchResults=array_filter($SearchResults,function ($element) use ($SEARCH,&$SearchResults) {
$key=key($SearchResults);
next($SearchResults);
return (stripos($element,$SEARCH)!==false||stripos($key,$SEARCH)!==false);
});
兼容方法
// 至少在没有匿名函数功能的PHP 5.2下测试成功
class SRFilter {
private $SRWD,$SRARR;
function __construct($SRWD,$SRARR) {
$this->SRWD = $SRWD;
$this->SRARR = $SRARR;
}
function comPare($i) {
$key=key($this->SRARR);
next($this->SRARR);
return (stripos($i,$this->SRWD)!==false||stripos($key,$this->SRWD)!==false);
}
}
$SearchResults=array_filter($SearchResults, array(new SRFilter($SEARCH,$SearchResults), 'comPare'));
No related posts.
