Reputation: 43
I hope I'm not reposting or being redundant here, still groking php arrays. I have a multidimensional array that looks like this:
Array
(
[0] => stdClass Object
(
[field_name] => step_one
[field_value] => A Message
)
[1] => stdClass Object
(
[field_name] => message_color
[field_value] =>
)
[2] => stdClass Object
(
[field_name] => Submitted Login
[field_value] => admin
)
[3] => stdClass Object
(
[field_name] => Submitted From
[field_value] => 127.0.0.1
)
[4] => stdClass Object
(
[field_name] => step_one
[field_value] => Another Message
)
[5] => stdClass Object
(
[field_name] => message_color
[field_value] => orange
)
[6] => stdClass Object
(
[field_name] => Submitted Login
[field_value] => admin
)
[7] => stdClass Object
(
[field_name] => Submitted From
[field_value] => 127.0.0.1
)
[8] => stdClass Object
(
[field_name] => step_one
[field_value] => some Other Idea
)
[9] => stdClass Object
(
[field_name] => message_color
[field_value] => pink
)
[10] => stdClass Object
(
[field_name] => Submitted Login
[field_value] => admin
)
[11] => stdClass Object
(
[field_name] => Submitted From
[field_value] => 127.0.0.1
)
) and I want it to read like this:
Array(
Array [0] (
[step_one] => Message
[message_color] =>
)
Array [1] (
[step_one] => Another Message
[message_color] => orange
)
Array [2] (
[step_one] => some other idea
[message_color] => pink
)
but I have no idea how to get there in php. I've tried array_merge(), and array_combine() but I'm just not getting anywhere. Any help would be greatly appreciated!
Upvotes: 1
Views: 219
Reputation: 197787
$reduce = function($input)
{
$current = 0;
return array_reduce($input, function($a, $b) use (&$current) {
isset($a[$current][$b->field_name]) && $current++;
$a[$current][$b->field_name] = $b->field_value;
return $a;
}, array());
};
print_r($reduce($input));
Output (I have a smaller dataset):
Array
(
[0] => Array
(
[step_one] => A Message
[message_color] =>
)
[1] => Array
(
[step_one] => Another Message
)
)
The tweak is to start a new element if in the current index ($current
) the key already exists.
Upvotes: 0
Reputation: 4164
Tim Withers solution or...
function gather($arr){
return array($arr->field_name=>$arr->field_value);
}
$newArr = array_map('gather',$oldArr);
With oldArr being the original!
Upvotes: 1
Reputation: 12059
Here is a simple loop that will do it.
foreach($obj_array as $obj){
$a_array[$obj->field_name]=$obj->field_value;
}
Upvotes: 2