在对象上使用PHP的array_filter函数

7

我试图在一个对象数组上使用array_filter,并将foo类的一个公共方法作为回调函数。然而,我不知道如何实现。

我得到了这个结果:Fatal error: Using $this when not in object context,我猜测这是因为它以静态方式调用了bar方法,但是如何正确地将对象传递给array_filter回调方法呢?

function foobar_filter($obj) {
    return $obj->bar();
}

class foo {
    private $value;
    public function __construct($value) {
        $this->value = $value;
    }
    public function bar() {
        // checking if $this is set to avoid "using this when not in object yadayada"-message
        if ($this) return ($this->value > 10);
        else return false;
    }
}

$arr = array(new foo(12), new foo(42), new foo(4));
var_dump($arr);

// Here is the workaround that makes it work, but I'd like to use the objects' method directly. This is the result that I am expecting to get from $arr3 as well
$arr2 = array_filter($arr, "foobar_filter");
var_dump($arr2);

// I would like this to work, somehow...
$arr3 = array_filter($arr, array(foo, "bar"));
var_dump($arr3);

因此,我期望的结果是一个包含两个foo类对象的数组,其值分别为12和42。

供您参考,我使用的是PHP 5.2.6,但如果任何PHP版本都可以实现,我将非常高兴。

5个回答

5
您可以在array_filter方法中使用Closure(>= PHP 5.3),例如:
$arrX = array_filter($arr, function($element) {
    return $element->bar();
});
var_dump($arrX)

1
这基本上与foobar_filter解决方案相同,只是使用了匿名函数。 - gen_Eric

2

我认为你可以像这样静态地调用它:

class foo {
    private $value;
    public function __construct($value) {
       $this->value = $value;
    }
    public static function bar($a) {        
        if ($a) return ($a->value > 10);
        else return false;
    }
}

$arr = array(new foo(12), new foo(42), new foo(4));

$arr3 = array_filter($arr, array('foo', "bar"));
var_dump($arr3);

1
如果你正在使用PHP 7.1+,你可以通过以下方式达到你的目标:
$arr3 = Arr::filterObjects($arr, 'bar');

使用this一个有用的数组函数类库。

1
问题在于bar方法不是静态的,需要在每个对象上调用。你的foobar_filter方法是正确的选择。没有其他方法,因为你需要在每个对象上调用bar(从而使array_filter每次调用不同的函数),你不能静态地调用它。

啊!我的问题在于我把bar看作是相同的函数,只是在不同的对象上。我没有把它看作是每个对象上的不同函数。+1并接受为答案! - Simon Forsberg

-1

实际上你可以这样做

array_filter($arr, [$this, 'bar'])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接