tags:

views:

18

answers:

4

Sorry for the terrible title, best I could think of at the time! Say I have a 'path' array like so;

array('this', 'is', 'the', 'path')

What would be the most effective method to end up with the array below?

array(
    'this' => array(
        'is' => array(
            'the' => array(
                'path' => array()
            )
        )
    )
)
A: 

not really elegant. but it works

$start = array('this', 'is', 'the', 'path')

$result[ $start[0] ][ $start[1] ][ $start[2] ][ $start[3] ] = array ();

bindo
Trouble is, that only works with a predefined array count - what if I don't know how many nodes there are in the path?
TheDeadMedic
+1  A: 

Just iterate over it with something like array_shift or array_pop:

$tree=array();
while (count($inarray)) {
    $tree=array(array_pop($inarray) => $tree);
}

Not tested, but that's the basic structure of it. Recursion also fits the task well. Alternatively, if you don't want to modify the initial array:

$result=array();
foreach (array_reverse($start) as $key)
    $result=array($key=>$result);
Yann Vernier
+1  A: 
function buildArrayFromPath( $path ) {
  $out = array();
  while( $pop = array_pop($path) ) $out = array($pop => $out);
  return $out;
}
nathan
+1  A: 

One recursive solution:

function find_in_array(&$array, &$path, $_i=0) {
  // sanity check
  if ( !(is_array($array) && is_array($path)) ) return false;
  $c = count($path); if ($_i >= $c) return false;

  $k = $path[$_i];
  if (array_key_exists($k, $array))
    return ($_i == $c-1) ? $array[$k] : find_in_array($array[$k], $path, $_i+1);
  else
    return false;
}

Parameter $_i is for internal use and should not be set when calling the function.

Tomalak