PHP 检查数组中值的函数

PHP Function to check value in Array

我正在尝试想出一个函数,以便从数组中获取一些特定数据。这是我为页面做的权限系统的一部分。

这是我拥有的数据数组:

[views] => Array
            (
                [0] => SimpleXMLElement Object
                    (
                        [permItem] => viewOriginalFeedback
                        [actions] => SimpleXMLElement Object
                            (
                                [view] => 0
                                [edit] => 0
                            )

                    )

                [1] => SimpleXMLElement Object
                    (
                        [permItem] => viewTarget
                        [actions] => SimpleXMLElement Object
                            (
                                [view] => 0
                                [edit] => 0
                            )

                    )

            )

    )

我想做的是创建一个函数,我可以在其中传递一个烫发项和像这样的操作。 if(myFunction('viewOriginalFeedback', 'view')) 如果这个 returns 1 我显示内容,如果它是 0 那么我知道不显示它。

问题是这些 views 可能根本不存在于数组中,因此在这种情况下它将是 false,就好像操作设置为 0 一样。

我正在玩类似这样的东西,但我觉得有更优雅的方法来完成它。

// Permission Check
function checkPerm($permItem, $action){
    foreach($permissions->data->views as $view){

        if($view->permItem == $permItem){

            if($view->actions == $action){
                    return $view->actions->$action;
            }

        }

    }
}

使用关联数组会更简单,不需要循环:

Array
(
    [viewOriginalFeedback] => Array
        (
            [view] => 0
            [edit] => 0
        )

    [viewTarget] => Array
        (
            [view] => 0
            [edit] => 0
        )

)

那么就这么简单:

if(isset($permissions[$permItem][$action])) {
    return (bool)$permissions[$permItem][$action];
}
return false;

您可以保持对象的使用,并通过字符串键保持简单:

[viewOriginalFeedback] => SimpleXMLElement Object
                (
                    [permItem] => viewOriginalFeedback
                    [actions] => SimpleXMLElement Object
                        (
                            [view] => 0
                            [edit] => 0
                        )

                )

同一张支票:

if(isset($permissions[$permItem]->actions->$action)) {
    return (bool)$permissions[$permItem]->actions->$action;
}
return false;

对于您当前的对象数组,您当前的方法可能是可行的方法,但更像是:

foreach($permissions->data->views as $view){
    if($view->permItem == $permItem){
        if(isset($view->actions->$action)){
            return (bool)$view->actions->$action;
        } else {
            return false;
        }
    }
}

我只是利用 array_filter 来缩短代码。这假设您不能转换为使用像 AbraCadaver 建议的关联数组。它的效率也比您自己的代码略低,因为 array_filter 将遍历数组的其余部分,即使它已找到第一个匹配项。

function checkPerm($permItem, $action){
    $val = array_filter($permissions->data->views, function($v) {
        return $v->permItem === $permItem;
    });
    return isset($vals[0]->$action) && (bool) $vals[0]->$action;
}