1

我想使用 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");
    }

    }

知道如何解决这个问题吗?

4

3 回答 3

2

利用$arr = array_filter($arr, array($this, 'isPunc'));

于 2013-11-12T10:21:37.157 回答
2
class Myclass(){

    private function isPunc($var) {
        if ($var=='.') {
            return TRUE;
        } else {
            return FALSE;
        }
    }

    public function myfunction($arr) {
         $arr = array_filter($arr, array($this,'isPunc'));
    }

}
于 2013-11-12T10:23:00.610 回答
0

array_filter() 需要一个 Callable。这是 PHP 中的一种特殊内部类型,它可以是以下四种情况:

  1. 带有函数名的字符串
  2. 以对象和方法名称为元素的数组
  3. 匿名函数
  4. 仿函数(实现 __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));

在这种情况下,过滤器即时工作。它仅在实际访问元素时使用。

于 2013-11-12T10:56:52.573 回答