Adições de chave de matriz dinâmica
Pergunta
Aqui está o meu pré -código ...
$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 entrada para o meu código, eu tenho uma lista de keys
e a number
. o number
deve ser definido para o valor do keys
Array sendo usado para gerar base de base infantil keys
Para uma certa matriz $array
.
Existe uma maneira diferente de conseguir isso? Não quero substituir as chaves/números com novos valores enquanto o código funciona - eval()
Preserva isso já, então meu novo código deve fazer o mesmo.
Solução
Aqui está um exemplo de código completo mostrando como funcionaria. O que é importante é que você use uma referência à matriz para poder modificá -la:
<?php
$keys = array('a', 'b', 'c', 'd');
$number = 10;
$org_array = array(
"a" => "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);
?>
Outras dicas
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 enquanto atravessa o ramo da sua árvore que 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);
Resultado:
array(1) {
["a"]=>
array(1) {
["b"]=>
array(1) {
["c"]=>
array(1) {
["d"]=>
int(10)
}
}
}
}