如何检查数组数组在PHP或Laravel中的值中是否具有键值对

时间:2018-03-23 14:44:20

标签: php arrays laravel

我有以下数组。我想知道数组的任何值是否包含键值对"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;
    }
}

有没有办法以更好的方式做到这一点?

2 个答案:

答案 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)

因此,从可读性和性能的角度来看,初始代码是赢家。