PHP - 在多维数组中的特定键后递归插入一对 key/value
PHP - Recursively insert a key/value pair after a specific key in multidimensional array
我有一个索引数组,其中包含任意数量的嵌套关联数组或索引数组。
我需要在每个数组中递归地插入一个新的 key/value 对 'apple' 如果它包含一个键 'banana'.
$original = [
0 => [
'something1' => 'something',
'banana' => 'yellow',
'something2' => [
'something3' => 'something',
'something4' => [
'something5' => 'something',
'banana' => 'yellow',
'something6' => [
'banana' => 'yellow',
]
],
'banana' => 'yellow',
],
'something7' => [
0 => [
'something8' => 'something',
'banana' => 'yellow',
],
],
],
1 => [
'something9' => 'something',
'banana' => 'yellow',
],
2 => [
'something10' => 'something',
],
];
这是预期的结果 - 'apple' 不必紧挨着 'banana' 插入,它可以位于同一级别数组中的任何位置,只要它是 [ 的兄弟项即可=21=].
$new = [
0 => [
'something1' => 'something',
'banana' => 'yellow',
'apple' => 'red',
'something2' => [
'something3' => 'something',
'something4' => [
'something5' => 'something',
'banana' => 'yellow',
'apple' => 'red',
'something6' => [
'banana' => 'yellow',
'apple' => 'red',
]
],
'banana' => 'yellow',
'apple' => 'red',
],
'something7' => [
0 => [
'something8' => 'something',
'banana' => 'yellow',
'apple' => 'red',
],
],
],
1 => [
'something9' => 'something',
'banana' => 'yellow',
'apple' => 'red',
],
2 => [
'something10' => 'something',
],
];
我能找到关于如何在平面数组中的某个键后插入 key/value 对的答案,但找不到在多维数组中递归这样做的答案。
$original = [
0 => [
'something1' => 'something',
'banana' => 'yellow',
'something2' => [
'something1' => 'something',
'something2' => [
'something1' => 'something',
'banana' => 'yellow',
'something2' => [
'banana' => 'yellow',
]
],
'banana' => 'yellow',
],
'something3' => [
0 => [
'something' => 'something',
'banana' => 'yellow',
],
],
],
1 => [
'something' => 'something',
'banana2' => 'yellow',
],
];
function ins_value_to_arr(&$arr, $insVal = [] , $sibling = NULL){
static $ins;
static $sib;
if($insVal){
$ins = $insVal;
$sib = $sibling;
}
$merge = false;
foreach($arr as $k => &$val){
if(is_array($val)){
ins_value_to_arr($val);
}
if($k == $sib){
$merge = true;
}
}
if($merge){
$arr = array_merge($arr,$ins);
}
return $arr;
}
// call -> ins_value_to_arr($original,['apple' => 'red'],'banana');
我有一个索引数组,其中包含任意数量的嵌套关联数组或索引数组。 我需要在每个数组中递归地插入一个新的 key/value 对 'apple' 如果它包含一个键 'banana'.
$original = [
0 => [
'something1' => 'something',
'banana' => 'yellow',
'something2' => [
'something3' => 'something',
'something4' => [
'something5' => 'something',
'banana' => 'yellow',
'something6' => [
'banana' => 'yellow',
]
],
'banana' => 'yellow',
],
'something7' => [
0 => [
'something8' => 'something',
'banana' => 'yellow',
],
],
],
1 => [
'something9' => 'something',
'banana' => 'yellow',
],
2 => [
'something10' => 'something',
],
];
这是预期的结果 - 'apple' 不必紧挨着 'banana' 插入,它可以位于同一级别数组中的任何位置,只要它是 [ 的兄弟项即可=21=].
$new = [
0 => [
'something1' => 'something',
'banana' => 'yellow',
'apple' => 'red',
'something2' => [
'something3' => 'something',
'something4' => [
'something5' => 'something',
'banana' => 'yellow',
'apple' => 'red',
'something6' => [
'banana' => 'yellow',
'apple' => 'red',
]
],
'banana' => 'yellow',
'apple' => 'red',
],
'something7' => [
0 => [
'something8' => 'something',
'banana' => 'yellow',
'apple' => 'red',
],
],
],
1 => [
'something9' => 'something',
'banana' => 'yellow',
'apple' => 'red',
],
2 => [
'something10' => 'something',
],
];
我能找到关于如何在平面数组中的某个键后插入 key/value 对的答案,但找不到在多维数组中递归这样做的答案。
$original = [
0 => [
'something1' => 'something',
'banana' => 'yellow',
'something2' => [
'something1' => 'something',
'something2' => [
'something1' => 'something',
'banana' => 'yellow',
'something2' => [
'banana' => 'yellow',
]
],
'banana' => 'yellow',
],
'something3' => [
0 => [
'something' => 'something',
'banana' => 'yellow',
],
],
],
1 => [
'something' => 'something',
'banana2' => 'yellow',
],
];
function ins_value_to_arr(&$arr, $insVal = [] , $sibling = NULL){
static $ins;
static $sib;
if($insVal){
$ins = $insVal;
$sib = $sibling;
}
$merge = false;
foreach($arr as $k => &$val){
if(is_array($val)){
ins_value_to_arr($val);
}
if($k == $sib){
$merge = true;
}
}
if($merge){
$arr = array_merge($arr,$ins);
}
return $arr;
}
// call -> ins_value_to_arr($original,['apple' => 'red'],'banana');