Level 88
It's an object because $item is an object I guess.
What happens when you do json_decode($data), do you get arrays than?
Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.
Hello everybody,
I am creating an API resource:
public function toArray($request)
{
return [
'permissions' => Permission::all()
];
}
This is the result Permission::all() in my browser's console:
{
"data": {
"permissions": [
{
"id": 1,
"name": "index users",
"guard_name": "web",
"created_at": "2019-06-11 06:45:52",
"updated_at": "2019-06-11 06:45:52"
},
{
"id": 2,
"name": "create users",
"guard_name": "web",
"created_at": "2019-06-11 06:45:52",
"updated_at": "2019-06-11 06:45:52"
},
{
"id": 3,
"name": "view users",
"guard_name": "web",
"created_at": "2019-06-11 06:45:52",
"updated_at": "2019-06-11 06:45:52"
},
{
"id": 4,
"name": "update users",
"guard_name": "web",
"created_at": "2019-06-11 06:45:52",
"updated_at": "2019-06-11 06:45:52"
},
{
"id": 5,
"name": "delete users",
"guard_name": "web",
"created_at": "2019-06-11 06:45:52",
"updated_at": "2019-06-11 06:45:52"
},
{
"id": 21,
"name": "index settings",
"guard_name": "web",
"created_at": "2019-06-11 06:45:52",
"updated_at": "2019-06-11 06:45:52"
},
{
"id": 22,
"name": "view settings",
"guard_name": "web",
"created_at": "2019-06-11 06:45:52",
"updated_at": "2019-06-11 06:45:52"
},
{
"id": 23,
"name": "update settings",
"guard_name": "web",
"created_at": "2019-06-11 06:45:52",
"updated_at": "2019-06-11 06:45:52"
}
]
}
}
I would like to an array like this:
[
{ 'group': 'users', 'view': true, 'edit': false, 'create': true, 'delete':
true },
{ 'group': 'settings', 'view': true, 'edit': false, 'create': true, 'delete':
true },
]
This is what I got so far:
Permission::all()->mapToGroups(function
($item){
$exploded = explode(' ', $item->name);
$item->group = $exploded[1];
$item->verb = $exploded[0];
$item->can = [$item->verb => true];
return [$item['group'] => $item['can']];
})->map(function($group){
$permission = $group->collapse();
return $permission;
})
This is the result in my browser's console:
{
"data": {
"permissions": {
"users": {
"index": true,
"create": true,
"view": true,
"update": true,
"delete": true
},
"settings": {
"index": true,
"view": true,
"update": true
}
}
}
}
These are my questions:
I think you can get around it by doing something like this
$data = Permission::all()->mapToGroups(function ($permission) {
$exploded = explode(' ', $permission->name);
return [$exploded[1] => [$exploded[0] => true]];
});
At least I got this back when running tinker
{"users":[{"index":true},{"create":true},{"view":true},{"update":true},{"delete":true}],"settings":[{"index":true},{"view":true},{"update":true}]}"
Looks like an array to me ;)
Please or to participate in this conversation.