6

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のクラスの2つのオブジェクトを持つ配列です。

参考までに、私はPHP 5.2.6を使用していますが、どのPHPバージョンでも可能であれば幸いです。

4

5 に答える 5

3

このようなarray_filterメソッドでClosure(> = PHP 5.3)を使用できます

$arrX = array_filter($arr, function($element) {
    return $element->bar();
});
var_dump($arrX)
于 2012-06-13T14:31:49.420 に答える
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);
于 2014-02-06T21:53:10.130 に答える
1

問題は、barメソッドが静的ではなく、各オブジェクトで呼び出す必要があることです。あなたのfoobar_filter方法が進むべき道です。bar他に方法はありません。オブジェクトを呼び出す必要があるため(したがって、array_filter毎回異なる関数を呼び出す必要があります)、静的に呼び出すことはできません。

于 2012-06-13T14:37:34.240 に答える
1

PHP 7.1以降を使用している場合は、次の方法で目標を達成できます。

$arr3 = Arr::filterObjects($arr, 'bar');

便利な配列関数でこの1つのクラスライブラリを使用します。

于 2018-09-05T22:22:30.637 に答える
-1

実際、あなたはそれをこのように行うことができます

array_filter($arr, [$this, 'bar'])
于 2017-01-17T10:16:31.357 に答える