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

我有一个深度未知的动态多维数组。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',

          ),

        )

      ),

    ),

  ),

);

这是我不成功的尝试


尝试1


public 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;

                }

            }


        }

    }


POPMUISE
浏览 37回答 1
1回答

慕仙森

正如您所说,代码正在正确替换该值。只是您当前正在返回$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,并且仅在替换时返回完整数组。否则,您没有任何迹象表明您何时可以停止进一步寻找。
打开App,查看更多内容
随时随地看视频慕课网APP