1

我正在尝试使用内置array_filter函数过滤数组。根据 PHP 手册中的示例,我必须提供回调函数的名称。所以,这是我尝试过的:

// This function is a method 
public function send($user_id, $access, $content, $aids)
{
    // check if user is allowed to see the attachments
    function is_owner($var)
    {
        return $this->attachment_owner($var, $user_id);
    }

    $aids = implode(';', array_filter(explode(';', $aids), 'is_owner'));
}

这是我得到的错误:

致命错误:在文件名行号中不在对象上下文中时使用 $this。

如何解决这个问题?

4

3 回答 3

3

您可以通过使其成为类的成员来避免使用嵌套函数

... inside a class
function is_owner($var)
{
    return $this->attachment_owner($var, $user_id);
}

public function send($user_id, $access, $content, $aids)
{
// check if user is allowed to see the attachments


$aids = implode(';', array_filter(explode(';', $aids), array($this, 'is_owner')));
... 

参考:

什么是嵌套函数

对象上下文中的 Array_filter,带有私有回调

于 2013-09-04T16:59:49.327 回答
2

由于您使用的是 PHP > 5.4.0,因此您可以创建一个匿名函数,甚至可以使用$this

public function send($user_id, $access, $content, $aids)
{   
    // check if user is allowed to see the attachments
    $is_owner = function ($var)
    {
        return $this->attachment_owner($var, $user_id);
    }
    $aids = implode(';', array_filter(explode(';', $aids), $is_owner));

尽管如此,我还是会选择 tim 的解决方案,因为它更干净。

于 2013-09-04T17:03:14.203 回答
1

一种解决方案是使用匿名函数:

$aids = implode(';', array_filter(explode(';', $aids), function($var) { return $this->attachment_owner($var, $user_id); }));
于 2013-09-04T17:02:49.640 回答