user774528
user774528

Reputation: 187

Dynamically convert keypath values from a flat array into a hierarchical multidimensional array

I have an array like this:

Array(
  'level1' => 'someval',
  'level2' => 'someotherval',
  'level3' => 'thirdval'
)

I want to turn it into this:

Array(
  'someval' => Array(
    'someotherval' => Array(
      'thirdval' => 1
    )
  )
)

Obviously I could build the example above by hand, but I don't know how many levels there will be. And this simple example might seem useless, but there are going to be more values, so there will be multiple arrays inside each of the levels.

Upvotes: 1

Views: 822

Answers (3)

gustavotkg
gustavotkg

Reputation: 4399

Do you need something like this?

$levels = array_keys(Array(
  'level1' => 'someval',
  'level2' => 'someotherval',
  'level3' => 'thirdval'
));
$array = Array();
$aux = &$array;
foreach ($levels as $level => $value) {
   if ($aux == 1)
       $aux = array($value => 1);
   $aux = &$aux[$value];
}
var_dump($array);

Upvotes: 0

Jose
Jose

Reputation: 3548

Here's my take on it:

function make_multi_level_array($arr) {
        if (count($arr) == 1) return array(array_pop($arr) => 1);
        else {
                $level_key = array_pop(array_reverse($arr));
                $sub_level = make_multi_level_array(
                        array_slice($arr,1,count($arr)-1)       
                );
                return array(
                        $level_key => $sub_level
                );
        }       

}
$arr = array(
   'level1' => 'someval',
   'level2' => 'someotherval',
   'level3' => 'thirdval',
);

var_dump(make_multi_level_array($arr));

Will output this:

array(1) {
  ["someval"]=>
  array(1) {
    ["someotherval"]=>
    array(1) {
      ["thirdval"]=>
      int(1)
    }
  }
}

Also tried other cases like below.

$arr = array(
  'level1' => 'someval',
  'level2' => 'someotherval',
  'level3' => 'thirdval',
  'level4' => 'fourthval'
);

Seems okay:

array(1) {
  ["someval"]=>
  array(1) {
    ["someotherval"]=>
    array(1) {
      ["thirdval"]=>
      array(1) {
        ["fourthval"]=>
        int(1)
      }
    }
  }
}

Upvotes: 0

genesis
genesis

Reputation: 50982

This will do it

$array = array(
          'level1' => array(
             'level2' => array(
                 'level3' => 1
              )
           )
         );

Upvotes: 2

Related Questions