2011-06-12 42 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