Dynamic Array Key Additions
Frage
Hier ist mein Prede ...
$keys = array('a', 'b', 'c', 'd');
$number = 10;
Und hier ist mein Code ...
eval('$array[\''.implode('\'][\'',$keys).'\'] = $number;');
Verwenden Sie das folgende Ergebnis ...
Array (
[a] => Array
(
[b] => Array
(
[c] => Array
(
[d] => 10
)
)
)
)
Das Problem ist, dass dies das genaue Ergebnis ist, das ich möchte, aber ich möchte nicht verwenden eval()
.
Als Eingabe in meinen Code habe ich eine Liste von keys
und ein number
. Das number
sollte auf den Wert der festgelegt werden keys
Array wird verwendet, um Kinderbasis zu generieren keys
Für ein bestimmtes Array $array
.
Gibt es eine andere Möglichkeit, dies zu erreichen? Ich möchte die Schlüssel/Zahlen nicht mit neuen Werten überschreiben, wenn der Code funktioniert - eval()
Bewahrt dies bereits, daher sollte mein neuer Code dasselbe tun.
Lösung
Hier ist ein vollständiges Code -Beispiel, das zeigt, wie es funktionieren würde. Wichtig ist, dass Sie einen Verweis auf das Array verwenden, damit Sie es ändern können:
<?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);
?>
Andere Tipps
Bitte beachten Sie, dass der folgende Code (den Sie bewerten) eine Warnung generieren und daher nicht an Projekten mit Fehlerberichten bis zum max.
$array = array();
$array['a']['b'] = 42; // $array['a'] is not an array... yet
Da Sie PHP 5 verwenden, können Sie mit Verweisen arbeiten, um Ihr Array zu manipulieren, während Sie den Zweig Ihres Baums durchqueren, den Sie ändern möchten.
$current = & $array;
foreach ($keys as $key):
if (!isset($current[$key]) || !is_array($current[$key]))
$current[$key] = array();
$current = & $current[$key];
endforeach;
$current = $value;
Bearbeiten: korrigiert, um Warnungen und Konflikte zu vermeiden.
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);
Ausgabe:
array(1) {
["a"]=>
array(1) {
["b"]=>
array(1) {
["c"]=>
array(1) {
["d"]=>
int(10)
}
}
}
}