为了账号安全,请及时绑定邮箱和手机立即绑定

基于另一个键的条件的数组递归替换?

基于另一个键的条件的数组递归替换?

PHP
POPMUISE 2024-01-19 10:12:04
我有一个深度未知的动态多维数组。key=>value我想根据另一个条件替换 a key=>value。例如,当is$settings[$cient_id]时,替换 的值。$form_id1f44537$data = array (  0 =>   array (    'id' => '2cd5985',    'elType' => 'section',    'settings' => array(),    'elements' => array (      0 => array (        'id' => '88063e6',        'elType' => 'column',        'settings' => array(),        'elements' => array (          0 =>           array (            'id' => '1f44537',            'elType' => 'widget',            'settings' => array (              'ap_google_sheet_client_id' => 'test_id',            ),            'elements' => array (            ),            'widgetType' => 'form',          ),        )      ),      1 => array (        'id' => '7878c73',        'elType' => 'column',        'settings' => array(),        'elements' => array (          0 =>           array (            'id' => '1f44537',            'elType' => 'widget',            'settings' => array (              'ap_google_sheet_client_id' => 'test_id',            ),            'elements' => array (            ),            'widgetType' => 'form',          ),        )      ),    ),  ),);这是我不成功的尝试尝试1public 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'] ) ) {                $elements = self::replace_recursive( $element['elements'], $form_id );                if ( $elements ) {                    return $elements;                }            }        }    }
查看完整描述

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,并且仅在替换时返回完整数组。否则,您没有任何迹象表明您何时可以停止进一步寻找。


查看完整回答
反对 回复 2024-01-19
  • 1 回答
  • 0 关注
  • 30 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信