如何将参数发送到PHP中的比较函数?

时间:2011-06-12 00:08:25

标签: php class compare yii

首先,我使用Yii框架完全使用PHP,尽管Yii最终与此问题没什么关系。

我有一个类,在其中我有一个名为$ data的数组。我想过滤掉与我发送给类的参数不匹配的数组中的某些元素(我将在下面添加一些语法给你一个更好的主意)。因此我使用array_filter,它需要其中一个输入作为比较函数(即,对于特定元素返回true或false的函数。任何导致返回'false'的函数都将从数组中删除。)< / p>

问题是因为输入的函数是在引号中输入的,所以我没有看到在实际类中使用比较函数的方法。但是当函数在类之外时,我无法调用我需要的实例变量。所以我真正需要的是能够以某种方式调用类的实例变量 ,将实例变量作为参数发送到函数,或以某种方式将比较函数保留在类中。

有关于此的任何想法吗?我提到的类是Yii中的一个小部件。下面是对该小部件的调用(不是那么重要)。相关参数是'params'。

$this->widget('application.widgets.CListViewParam', array(
    'dataProvider'=>$dataProvider,
    'itemView'=>'_view',
    'params'=>array('receiverId'=>Yii::app()->user->userId),
));

小部件中的类中有一个实例变量来保存参数:

public $params = array();

然后调用array_filter和比较函数:

$data = array_filter($data, "filterData");

实际比较功能并不重要,但下面是骨架。请记住,它不在课堂上。

function filterData($item) {
    // unable to access $this->params inside of this function!
}

3 个答案:

答案 0 :(得分:7)

如果它在课外,无法访问$this->params,那么为什么不把它放在课堂上呢?

class MyClass {

    public $params;

    public function widget() {
        // ...
        $filtered = array_filter($array, array($this, 'filterData'));
    }

    private function filterData($item) {
       // $this->params is now accessible
    }

}

答案 1 :(得分:4)

您可以使用lambda构造来使用回调中所需的任何变量。例如,而不是在此代码中对值1.5进行硬编码:

$array = Array(1.0, 2.0, 3.0, 4.0);

function cmp($x) { return $x > 1.5; }
print_r(array_filter($array, cmp));

您可以将其作为变量传递给lambda构造:

$array = Array(1.0, 2.0, 3.0, 4.0);

$data = 1.5;
$lambda = function($x) use ($data) { return $x > $data; };
print_r(array_filter($array, $lambda));

如果您想修改$data,请使用use(&$data)

答案 2 :(得分:1)

$params = $this->params;
$data = array_filter($data, function($item) use ($params){

});