adições de teclas de matriz dinâmicas

Aqui está o meu precode …

$keys = array('a', 'b', 'c', 'd'); $number = 10; 

E aqui está o meu código …

 eval('$array[\''.implode('\'][\'',$keys).'\'] = $number;'); 

Usando isso, recebo o seguinte resultado …

 Array ( [a] => Array ( [b] => Array ( [c] => Array ( [d] => 10 ) ) ) ) 

Agora, o problema é que este é o resultado exato que eu quero, mas não quero usar eval() .

Como input para o meu código, eu tenho uma lista de keys e um number . O number deve ser configurado para o valor da matriz de keys está sendo usada para gerar keys baseadas em filhos para uma determinada matriz $array .

Existe uma maneira diferente de conseguir isso? Eu não quero replace as teclas / números por novos valores à medida que o código funciona – eval() preserva isso já, então meu novo código deve fazer o mesmo.

Aqui está um exemplo de código completo que mostra como isso funcionaria. O que é importante é que você use uma referência à matriz para que você possa modificá-la:

  "string", "z" => array( "k" => false) ); function write_to_array(&$array, $keys, $number){ $key = array_shift($keys); if(!is_array($array[$key])) $array[$key] = array(); if(!empty($keys)){ write_to_array($array[$key], $keys, $number); } else { $array[$key] = $number; } } write_to_array($org_array, $keys, $number); print_r($org_array); ?> 

Observe que o código abaixo (que você avalia) gerará um aviso e, portanto, não funcionará em projetos com relatórios de erros até o máximo:

 $array = array(); $array['a']['b'] = 42; // $array['a'] is not an array... yet 

Como você está usando o PHP 5, você pode trabalhar com referências para manipular sua matriz ao percorrer o ramo da sua tree que você deseja modificar.

 $current = & $array; foreach ($keys as $key): if (!isset($current[$key]) || !is_array($current[$key])) $current[$key] = array(); $current = & $current[$key]; endforeach; $current = $value; 

Editar: corrigido para evitar avisos e conflitos.

 function deepmagic($levels, $value) { if(count($levels) > 0) { return array($levels[0] => deepmagic(array_slice($levels, 1), $value)); } else { return $value; } } $a = deepmagic(Array('a', 'b', 'c', 'd'), 10); var_dump($a); 

Saída:

 array(1) { ["a"]=> array(1) { ["b"]=> array(1) { ["c"]=> array(1) { ["d"]=> int(10) } } } }