2011-06-12 1 views
2

처음에는 Yii 프레임 워크를 사용하여 PHP로 작업하고 있습니다.하지만 Yii는 궁극적으로이 질문과 관련이 거의 없습니다.PHP의 비교 함수에 매개 변수를 보내려면 어떻게해야합니까?

클래스가 있는데, 그 안에 $ data라는 배열이 있습니다. 클래스에 보내는 매개 변수와 일치하지 않는 배열의 특정 요소를 필터링하려고합니다 (더 나은 아이디어를 제공하기 위해 아래에 몇 가지 구문을 넣을 것입니다). 따라서 array_filter를 사용하고 있는데, 입력 중 하나가 비교 함수 (즉, 특정 요소에 대해 true 또는 false를 반환하는 입력 중 하나)가 필요합니다. 'false'가 반환되도록하는 모든 것은 배열에서 제거됩니다.

입력 한 함수가 따옴표로 묶여 있기 때문에 실제 함수 내에서 비교 함수를 사용할 수있는 방법이 없다는 것이 문제입니다. 그러나 함수가 클래스 외부에있을 때 필요한 인스턴스 변수를 호출 할 수 없습니다. 그래서 실제로 필요한 것은 인스턴스 변수 을 클래스의 외부로 호출하거나, 인스턴스 변수를 매개 변수로 함수에 보내거나, 클래스 내에서 어떻게 든 비교 함수를 유지할 수있게하는 것입니다.

이것에 대한 아이디어가 있습니까? 제가 언급 한 수업은 Yii의 위젯입니다. 아래는 위젯 (중요하지 않음)에 대한 호출입니다. 관련 매개 변수는 '매개 변수'입니다.

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

:

public $params = array(); 

그런 array_filter의 호출 및 비교 기능이있다 :

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

매개 변수를 저장할 수있는 위젯의 클래스 내에서 인스턴스 변수가있다 실제 비교 기능은 중요하지 않지만 아래는 해골입니다. 그것이 교실 밖이라는 것을 기억하십시오.

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 
    } 

} 
+0

감사합니다. 그런 식으로 배열을 매개 변수로 제공 할 수 있는지 알지 못했습니다. 쉬워요! – Paragon

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

}); 
4

당신은 어떤 변수를 사용하는 람다 구문을 사용 할 수 있습니다 콜백이 필요하다. 예를 들어, 대신이 코드의 값 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)); 

당신이 use(&$data)를 사용 $data을 수정하고자하는 경우.

+0

+1을 공유해 주셔서 감사합니다. – stefgosselin

+0

와우, 정말 흥미 롭습니다. 독특한 응답에 대해 감사드립니다. – Paragon