【问题标题】:How can I send a parameter to a compare function in PHP?如何将参数发送到 PHP 中的比较函数?
【发布时间】:2011-06-12 00:08:24
【问题描述】:

首先,我使用 Yii 框架完全在 PHP 中工作,尽管 Yii 最终与这个问题无关。

我有一个类,在其中我有一个名为 $data 的数组。我想过滤掉数组中与我发送给类的参数不匹配的某些元素(我将在下面放置一些语法,让您有一个更好的想法)。因此,我使用array_filter,它需要它的一个输入是一个比较函数(即,一个为特定元素返回真或假的函数。任何导致返回“假”的东西都会从数组中删除)。

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

对此有什么想法吗?我提到的类是 Yii 中的一个小部件。下面是对该小部件的调用(不是那么重要)。相关参数是'params'。

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

widget中的类中有一个实例变量来保存参数:

public $params = array();

然后是调用array_filter和比较函数:

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

实际的比较函数并不重要,但下面是骨架。请记住,它在课堂之外。

function filterData($item) {
    // unable to access $this->params inside of this function!
}

【问题讨论】:

  • 你在课堂上考虑过static 方法吗?

标签: php class compare yii


【解决方案1】:

如果在类外无法访问$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
    }

}

【讨论】:

  • 谢谢,我不知道我可以以这种方式提供一个数组作为参数。轻松愉快!
【解决方案2】:

您可以使用 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)

【讨论】:

  • 哇,这真的很有趣。非常感谢您的独特回复!
【解决方案3】:
$params = $this->params;
$data = array_filter($data, function($item) use ($params){

});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2018-10-10
    • 2019-12-29
    • 1970-01-01
    • 2016-01-13
    相关资源
    最近更新 更多