1 回答

TA貢獻1827條經驗 獲得超8個贊
正如您所說,代碼正在正確替換該值。只是您當前正在返回$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 關注
- 122 瀏覽
添加回答
舉報