【问题标题】:PHP - How to remove duplicate values from array (compare 2 arrays)PHP - 如何从数组中删除重复值(比较 2 个数组)
【发布时间】:2019-05-22 19:51:54
【问题描述】:

我想从$allPermissions 数组中删除$userPermissions 数组中的值。

怎么做? array_uniquearray_diff我已经合并了,还没有来解决这个问题。有人什么?

public function notAssigned($id, Request $request)
{
    $user = User::findOrFail($id);
    $userPermissions = [{"id":5,"name":"create post","guard_name":"web","created_at":"2018-12-22 02:44:35","updated_at":"2018-12-22 02:44:35","pivot":{"model_id":3,"permission_id":5,"model_type":"App\\User"}}];
    $allPermissions = [{"id":5,"name":"create post","guard_name":"web","created_at":"2018-12-22 02:44:35","updated_at":"2018-12-22 02:44:35"},{"id":6,"name":"edit post","guard_name":"web","created_at":"2018-12-22 02:44:46","updated_at":"2018-12-22 02:44:46"},{"id":7,"name":"delete post","guard_name":"web","created_at":"2018-12-22 02:44:59","updated_at":"2018-12-22 02:44:59"}];

    $permissions = array_unique(array_merge($userPermissions, $allPermissions));
    $role = auth()->user()->hasRole([2]);
    $permission = auth()->user()->can('edit user permission');

    if ( $role == true || $permission == true ) {
        return $permissions;
    } else {
        abort(403, 'Access Denied');
    }
}

编辑:

这些是var_dump$userPermissions$allPermissionsallPermissions 的输出:

var_dump($userPermissions):

    array(1) { [0]=> object(stdClass)#361 (6) { ["id"]=> int(5) ["name"]=> string(11) "create post" ["guard_name"]=> string(3) "web" ["created_at"]=> string(19) "2018-12-22 02:44:35" ["updated_at"]=> string(19) "2018-12-22 02:44:35" ["pivot"]=> object(stdClass)#360 (3) { ["model_id"]=> int(3) ["permission_id"]=> int(5) ["model_type"]=> string(8) "App\User" } } }

var_dump($allPermissions):

    array(3) { [0]=> object(stdClass)#374 (5) { ["id"]=> int(5) ["name"]=> string(11) "create post" ["guard_name"]=> string(3) "web" ["created_at"]=> string(19) "2018-12-22 02:44:35" ["updated_at"]=> string(19) "2018-12-22 02:44:35" } [1]=> object(stdClass)#377 (5) { ["id"]=> int(6) ["name"]=> string(9) "edit post" ["guard_name"]=> string(3) "web" ["created_at"]=> string(19) "2018-12-22 02:44:46" ["updated_at"]=> string(19) "2018-12-22 02:44:46" } [2]=> object(stdClass)#376 (5) { ["id"]=> int(7) ["name"]=> string(11) "delete post" ["guard_name"]=> string(3) "web" ["created_at"]=> string(19) "2018-12-22 02:44:59" ["updated_at"]=> string(19) "2018-12-22 02:44:59" } }

【问题讨论】:

  • $allPermissions = [{"..."}]; 这不是正确的 PHP 数组语法。它看起来像是一个数组中 JSON 的一些奇怪组合。
  • @ArtisticPhoenix 我从 Spatie\permissions 的内置函数中得到了这样一个数组。如何从中制作一个数组?
  • 试试这个$userPermissions = json_decode('{"id":5,"name":"create post",...}', true); 我不知道你还能怎么做,你有一个PHP的编译器错误,这意味着它甚至不会完成解析这个文件,更不用说运行它了。但是没有确切地看到那些“东西”是我所能做的就是推断。 `
  • $userPermissions = json_decode($user->permissions[0], true);返回 {"id":5,"name":"create post", ... ,"pivot":{"model_id":3,"permission_id":5,"model_type":"App\\User"}}
  • 正如我所说的,我没有看到 $userPermissions 到底是什么,我无法告诉你,['{"id":6, ... }']'[{"id":6, ... }]' 之间有很大的不同,一个是数组,另一个是字符串,我没有知道除了您发布的内容之外您还有什么,[{"id":5,...}] 在 PHP 中的语法不正确(所以不能是这样,否则它不会在变量中)

标签: php arrays laravel duplicates


【解决方案1】:

假设您的数组有效,您可以使用 array-filter

$userP = '[{"id":5,"name":"create post","guard_name":"web","created_at":"2018-12-22 02:44:35","updated_at":"2018-12-22 02:44:35"}]';
$userPermissions = json_decode($userP, true); // will convert to array.

$allP = '[{"id":5,"name":"create post","guard_name":"web","created_at":"2018-12-22 02:44:35","updated_at":"2018-12-22 02:44:35"},{"id":6,"name":"edit post","guard_name":"web","created_at":"2018-12-22 02:44:46","updated_at":"2018-12-22 02:44:46"},{"id":7,"name":"delete post","guard_name":"web","created_at":"2018-12-22 02:44:59","updated_at":"2018-12-22 02:44:59"}]';
$allPermissions = json_decode($allP , true); // will convert to array.

$userPermissionIds = array_column($userPermissions, "id")
$filteredPermission = array_filter($allPermissions , function($elem) use ($userPermissionIds) {
    return !in_array($elem["id"], $userPermissionIds);
});  

这将导致$filteredPermission 仅包含用户权限数组中不存在的元素

已编辑:如果您想保留对象数组,可以使用:

$userPermissionIds = array();
foreach($userPermissions as $per)
    $userPermissionIds[] = $per->id;

$filteredPermission = array_filter($allPermissions , function($elem) use ($userPermissionIds) {
    return !in_array($elem->id, $userPermissionIds);
});

【讨论】:

  • 对于$userPermissions变量,我使用“$user-> permissions;”动态输入数据然后检查 $userPermissions 变量后,我在其中: [{"id": 5, "name": "create post", ..., "pivot": {"model_id": 3, "permission_id": 5、“model_type”:“\\应用用户”}}]。使用您的解决方案后,我收到错误消息:“array_column () 期望参数 1 是数组,给定对象”。
  • 而 $ userPermissions = [$user-> 权限]; $allPermissions = [权限:: get ()];我收到“未定义索引:id”错误
  • @MateuszDomurad 因为你的数组是对象数组而不是数组数组。将这些对象转换为数组(通过使用带有 true 作为第二个参数的 json_decode)将允许您使用我发布的简单代码。如果您想将它们保留为对象,请发布两个数组的 var 转储(示例),我将更新我的答案
  • 我发布了 var 转储 :)
  • 但是如何使用 foreach 例如 id 摆脱这种情况?
猜你喜欢
  • 2012-01-31
  • 2017-12-31
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 2019-09-26
相关资源
最近更新 更多