I need to update a multidimensional array by same key paths of a multidimensional array.
I think my code can be better condensed :
//source
$array = [
"hero" => [
"name" => "Peter",
"job" => "Spider Man"
],
"dog" => [
"age" => 5,
"toys" => [
"first" => "bone",
"second" => "ball"
]
]
];
//values to update
$toUpdate = [
"hero" => [
"name" => "Peter Parker",
"age" => 26
],
"dog" => [
"name" => "Rex",
"toys" => [
"second" => "frisbee"
]
]
];
$paths = nested_values($toUpdate);
foreach ($paths as $path => $value) {
$arr = &$array;
$parts = explode('/', $path);
foreach($parts as $key){
$arr = &$arr[$key];
}
$arr = $value;
}
function nested_values ($array, $path="") {
$output = array();
foreach ($array as $key => $value) {
if (is_array($value)) {
$output = array_merge($output, nested_values($value, (!empty($path)) ? $path.$key."/" : $key."/"));
}
else $output[$path.$key] = $value;
}
return $output;
}
var_dump($array);
/*
(array) [2 elements]
hero:
(array) [3 elements]
name: (string) "Peter Parker"
job: (string) "Spider Man"
age: (integer) 26
dog:
(array) [3 elements]
age: (integer) 5
toys:
(array) [2 elements]
first: (string) "bone"
second: (string) "frisbee"
name: (string) "Rex"
*/