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;
}
我正在尝试想出一个函数,以便从数组中获取一些特定数据。这是我为页面做的权限系统的一部分。
这是我拥有的数据数组:
[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;
}