I have string:
Main.Sub.SubOfSub
And some kind of data, may be a string:
SuperData
How I can transform it all to this array above?
Array
(
[Main] => Array
(
[Sub] => Array
(
[SubOfSub] => SuperData
)
)
)
Thanks for help, PK
Given the values
$key = "Main.Sub.SubOfSub";
$target = array();
$value = "SuperData";
Here's some code I have lying around that does what you need¹:
$path = explode('.', $key);
$root = &$target;
while(count($path) > 1) {
$branch = array_shift($path);
if (!isset($root[$branch])) {
$root[$branch] = array();
}
$root = &$root[$branch];
}
$root[$path[0]] = $value;
See it in action.
¹ Actually it does slightly more than that: it can be trivially encapsulated inside a function, and it is configurable on all three input values (you can pass in an array with existing values, and it will expand it as necessary).
Like Jon suggested (and being asking feedback for in chat), a reference/variable alias is helpful here to traverse the dynamic stack of keys. So the only thing needed is to iterate over all subkeys and finally set the value:
$rv = &$target;
foreach(explode('.', $key) as $pk)
{
$rv = &$rv[$pk];
}
$rv = $value;
unset($rv);
The reference makes it possible to use a stack instead of recursion which is generally more lean. Additionally this code prevents to overwrite existing elements in the $target
array. Full example:
$key = "Main.Sub.SubOfSub";
$target = array('Main' => array('Sub2' => 'Test'));
$value = "SuperData";
$rv = &$target;
foreach(explode('.', $key) as $pk)
{
$rv = &$rv[$pk];
}
$rv = $value;
unset($rv);
var_dump($target);
Output:
array(1) {
["Main"]=>
array(2) {
["Sub2"]=>
string(4) "Test"
["Sub"]=>
array(1) {
["SubOfSub"]=>
string(9) "SuperData"
}
}
}
Demo
Related Question(s):
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With