首先,我使用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!
}
答案 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){
});