kevinjharley
kevinjharley

Reputation: 43

How to turn a multidimensional array into an associative array

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

Answers (3)

hakre
hakre

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

anson
anson

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

Tim Withers
Tim Withers

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

Related Questions