2011-06-12 43 views
2

首先,我完全使用Yii框架在PHP中工作,尽管Yii最终与这个问题没有多大关系。如何向PHP中的比较函数发送参数?

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

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

对此的任何想法?我提到的类是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! 
} 
+0

你有没有考虑过在你的课堂中使用静态方法? – 2011-06-12 00:14:39

回答

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 
    } 

} 
+0

谢谢,我不知道我可以以这种方式提供一个数组作为参数。十分简单! – Paragon 2011-06-12 00:20:37

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

}); 
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)); 

你可以把它作为一个变量拉姆达构造:

$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)

+0

+1我喜欢这个,感谢分享 – stefgosselin 2011-06-12 00:26:21

+0

哇,这真的很有趣。非常感谢独特的回应! – Paragon 2011-06-12 00:42:39