我想使用 array_filter 删除数组中值等于特定字符(如 '." )的那些项目。为此,所以我使用了以下代码,但我不知道如何将回调函数传递给array_filter:
class Myclass(){
private function isPunc($var){
if($var=='.'){
return TRUE;
}else{
return FALSE;
}
public function myfunction($arr){
$arr = array_filter($arr,"isPunc");
}
}
知道如何解决这个问题吗?
class Myclass(){
private function isPunc($var) {
if ($var=='.') {
return TRUE;
} else {
return FALSE;
}
}
public function myfunction($arr) {
$arr = array_filter($arr, array($this,'isPunc'));
}
}
使用$arr = array_filter($arr, array($this, 'isPunc'));
array_filter() 需要一个可调用的。这是 PHP 中一种特殊的内部类型,可以包含以下四项:
- 具有函数名称的字符串
- 以对象和方法名称作为元素的数组
- 匿名函数
- 函子(实现__invoke的对象)
在您的情况下,第二个变体应该有效:
class FilterIsDot {
private function accept($element) {
if($element == '.'){
return TRUE;
}else{
return FALSE;
}
}
public function filter($array) {
return array_filter(
$array, array($this, 'accept')
);
}
}
$in = array('.', 'foo');
$filter = new FilterIsDot();
var_dump($filter->filter($in));
我建议采用不同的方法来避免array_filter()。SPL 包含一个 FilterIterator 类。您可以扩展此类:
class FilterIsDot extends FilterIterator {
public function __construct($arrayOrIterator) {
parent::__construct(
is_array($arrayOrIterator)
? new ArrayIterator($arrayOrIterator)
: $arrayOrIterator
);
}
public function accept() {
if($this->current() == '.') {
return TRUE;
}else{
return FALSE;
}
}
}
$in = array('.', 'foo');
$filter = new FilterIsDot($in);
var_dump(iterator_to_array($filter));
在这种情况下,过滤器会动态工作。仅当实际访问元素时才使用它。