Reputation: 18200
Let's say I have this PHP code using Laravel 5.6:
$action = [
[
"name" => "action",
"value" => "DepositMoney"
],
[
"name" => "coins",
"type" => "number",
"value" => "534"
]
];
return collect($action)->map(function($item, $key) {
return [
$item['name'] => $item['value']
];
});
which produces:
[
{
"action": "DepositMoney"
},
{
"coins": "534"
}
]
How do I make it so I can merge those together and produce this instead (using something from here: https://laravel.com/docs/5.6/eloquent-collections#available-methods):
[
"action" => "DepositMoney",
"coins" => "534"
]
Thanks. This is for form_params
on Guzzle.
Upvotes: 0
Views: 3091
Reputation: 7334
It is simple, run collapse()
method on the result as follows:
return collect($action)->map(function($item, $key) {
return [
$item['name'] => $item['value']
];
})->collapse();
//Gives you:
{
"action": "DepositMoney",
"coins": "534"
}
See Method Collapse Otherwise you can use other array helper e.g array_collapse functions:
return array_collapse(array_map(function($item) {
return [
$item['name'] => $item['value']
];
}, $action));
Upvotes: 2
Reputation: 2877
You need the reduce()
function, to create a single value from multiple elements of an array. Documentation is here: https://laravel.com/docs/5.6/collections#method-reduce
I would suggesting trying this (I didn't test it, but you get the idea, and should be able to understand how to use reduce
from this example):
return collect($action)->map(function($item, $key) {
return [
$item['name'] => $item['value']
];
})->reduce(function ($carry, $item) {
foreach ($item as $k => $v) {
$carry[$k] = $v;
}
return $carry;
});
Upvotes: 3