Функция PHP для проверки значения в массиве

0

Я пытаюсь придумать функцию, чтобы получить некоторые конкретные данные из массива. Это часть системы разрешений, которую я делаю для страницы.

Вот массив данных, который у меня есть:

[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
                            )

                    )

            )

    )

То, что я пытаюсь сделать, это создать функцию, в которой я могу пройти, передать ей элемент perm и действие, подобное этому. if(myFunction('viewOriginalFeedback', 'view')) если это возвращает 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;
            }

        }

    }
}
  • 0
    Вы, вероятно, хотите if(isset($view->actions->$action)) и я бы, вероятно, пошел за ассоциативный массив вместо массива объектов.
  • 0
    ваш код выглядит нормально, в чем проблема?
Теги:
arrays
function

2 ответа

1
Лучший ответ

Было бы проще и не требовать цикла для использования ассоциативного массива:

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;
        }
    }
}
  • 0
    Спасибо за ответ. Похоже, это был бы лучший путь. Тем не менее, я пытаюсь посмотреть на изменение моего SQL, чтобы обеспечить необходимый формат для этого. Я использую TSQL и вывожу его в виде XML, поэтому мне нужно получить правильный формат.
  • 0
    Добавлен регистр для вашего текущего массива объектов.
Показать ещё 1 комментарий
0

Я просто использую 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;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню