我有以下数组。我想知道数组的任何值是否包含键值对"RoleCode" => "Admin"
。
[
0 => [
"RoleCode" => "Admin"
"RoleName" => "Administrator"
]
1 => [
"RoleCode" => "PM"
"RoleName" => "ProjectManager"
]
2 => [
"RoleCode" => "ScheduleUser"
"RoleName" => "Schedule User"
]
]
我可以编写一个很长的代码来查找它,如下所示:
$isAdmin = false;
foreach ($user['Roles'] as $role) {
if ($role['RoleCode'] == 'Admin') {
$isAdmin = true;
}
}
有没有办法以更好的方式做到这一点?
答案 0 :(得分:4)
您可以使用array_column()
和in_array()
:
$isAdmin = in_array('Admin', array_column($user['Roles'], 'RoleCode')) ;
array_column()
将返回一个包含'RoleCode'
key in_array()
会检查Admin
是否在答案 1 :(得分:3)
这取决于更好的方式。
当找到项目时添加break
的当前解决方案:
$isAdmin = false;
foreach ($user['Roles'] as $role) {
if ($role['RoleCode'] == 'Admin') {
$isAdmin = true;
break;
}
}
在最坏的情况下将是O(n)
。
其他解决方案,如另一个答案
$isAdmin = in_array('Admin', array_column($user['Roles'], 'RoleCode'));
最佳情况为O(n) + O(1)
,最差情况为O(n) + O(n)
。超过初始foreach
。
另一个是过滤:
$isAdmin = !empty(array_filter(
$user['Roles'],
function ($v) { return $v['RoleCode'] == 'Admin'; }
));
总是O(n)
因此,从可读性和性能的角度来看,初始代码是赢家。