Как я могу отправить параметр в функцию сравнения в PHP? - PullRequest
2 голосов
/ 12 июня 2011

Для начала, я полностью работаю в PHP с использованием инфраструктуры Yii, хотя в конечном итоге Yii имеет мало общего с этим вопросом.

У меня есть класс, и внутри него есть массив с именем $ data. Я хочу отфильтровать некоторые элементы массива, которые не соответствуют параметрам, которые я отправляю в класс (ниже я приведу некоторый синтаксис, чтобы дать вам лучшее представление). Поэтому я использую array_filter, и он требует, чтобы один из его входов был функцией сравнения (т. Е. Тот, который возвращает true или false для определенного элемента. Любые, которые вызывают возвращение 'false', удаляются из массива). 1003 *

Проблема в том, что поскольку введенная функция вводится в кавычках, я не вижу способа использовать функцию сравнения внутри фактического класса. Но когда функция находится за пределами класса, я не могу вызвать нужную мне переменную экземпляра. Поэтому мне действительно нужно иметь возможность вызывать переменную экземпляра вне класса, посылать переменную экземпляра в функцию в качестве параметра или каким-либо образом сохранять функцию сравнения внутри класса.

Есть идеи по этому поводу? Класс, который я упомянул, является виджетом в 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 ]

7 голосов
/ 12 июня 2011

Если он вне класса и не может получить доступ к $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
    }

}
4 голосов
/ 12 июня 2011

Вы можете использовать лямбда-конструкцию, чтобы использовать любые переменные, которые вам нужны в обратном вызове. Например, вместо жесткого кодирования значения 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).

1 голос
/ 12 июня 2011
$params = $this->params;
$data = array_filter($data, function($item) use ($params){

});
...