1 回答
TA贡献1827条经验 获得超7个赞
正如您所说,代码正在正确替换该值。只是您当前正在返回$elements从递归调用返回的值。但这是一个比整个数组更小的数组,因此您不应该将该数组进一步向上冒泡。
相反,只需将该结果注入到“elements”键处的当前包装数组中,然后返回结果数组:
$data = [[
'id' => '2cd5985',
'elements' => [[
'id' => '88063e6',
'elements' => [[
'id' => '1f44537',
'settings' => [
'form_name' => 'New Form',
'form_fields' => [[
'custom_id' => 'name',
'field_label' => 'Name',
'placeholder' => 'Name',
'_id' => '948d900',
'field_pattern_message' => 'Please match the requested format',
],
[
'custom_id' => 'email',
'field_type' => 'email',
'required' => 'true',
'field_label' => 'Email',
'placeholder' => 'Email',
'_id' => '243a095',
'field_pattern_message' => 'Please match the requested format',
]],
'ap_google_sheet_client_id' => '',
],
'elements' => [],
'widgetType' => 'form',
]],
'isInner' => false,
]],
'isInner' => false,
]];
function replace_recursive( $elements, $form_id ) {
foreach ( $elements as &$element) {
if ( $element['id'] === $form_id ) {
$element['settings']['ap_google_sheet_client_id'] = 'replaced';
return $elements;
}
if ( ! empty( $element['elements'] ) ) {
$subelements = replace_recursive( $element['elements'], $form_id );
if ( $subelements ) {
// Inject result back into our array
$element["elements"] = $subelements;
return $elements;
}
}
}
}
$res = replace_recursive( $data, "1f44537");
var_dump($res);
请参阅此沙箱中的另一个输入示例
在第二次尝试中,您将return循环的外部放置起来。但这意味着你总是返回数组。然而,您需要以某种方式指示更换是否发生。当您没有替换值时最好返回null,并且仅在替换时返回完整数组。否则,您没有任何迹象表明您何时可以停止进一步寻找。
- 1 回答
- 0 关注
- 71 浏览
添加回答
举报