Wrapping certain elements in an array with an array with PHP I have a function that's doing this correctly, but I feel as though this can be done (possibly) with minimal code, with recursion, but I'm just wracking my brain. Basically I have JSON that gets decoded to an array. What I want to do is turn this:


{
  "parentView": {
    "childViews": [
      {
        "type": "container-fluid",       
        "childViews": [        
          {
            "type": "row",  
            "childViews": [            
              {
                "type": "slider"
              },
              {
                "type": "slider"
              }
            ]            
          }        
        ]
      }
    ]    
  }
}



Into this:


{
  "parentView": {
    "childViews": [
      {
        "type": "controller",
        "childViews": [
          {
            "type": "container-fluid",       
            "childViews": [        
              {
                "type": "controller",
                "childViews": [
                  {
                    "type": "row",
                    "childViews": [            
                      {
                        "type": "controller",
                        "childViews": [
                          {
                            "type": "slider"
                          }
                        ]
                      },
                      {
                        "type": "controller",
                        "childViews": [
                          {
                            "type": "slider"
                          }
                        ]
                      }
                    ]            
                  }        
                ]
              }
            ]
          }
        ]
      }
    ]    
  }
}



Here is the code I am using to make it work how I need. I am just looking for a cleaner method:

function createControls($parentView)
{
    $newArr = $parentView;

    foreach ($parentView as $k =&gt; $v) {
        $newArr[$k] = [
            'type' =&gt; 'control',
            'childViews' =&gt; $v
        ];

        if ($v['childViews']) {
            foreach ($v['childViews'] as $kk =&gt; $vv) {
                $newArr[$k]['childViews']['childViews'] = [
                    'type' =&gt; 'control',
                    'childViews' =&gt; $vv
                ];

                if ($vv['childViews']) {
                    foreach ($vv['childViews'] as $_k =&gt; $_v) {
                        $newArr[$k]['childViews']['childViews']['childViews']['childViews'][$_k] = [
                            'type' =&gt; 'control',
                            'childViews' =&gt; $_v
                        ];
                    }
                }
            }
        }
    }

    return $newArr;
}

$newArr = createControls($arr['parentView']['childViews']);
$arr['parentView']['childViews'] = $newArr;
You can try something like this, note that it is untested:

&lt;?php
function createControls($parentView) {
    $newArr = $parentView;
    foreach ($parentView as $k =&gt; $v) {
        $newArr[$k] = ['type' =&gt; 'control'];
        if (isset($v['childViews'])) {
            $v = createControls($v['childViews']);
        }
        $newArr[$k]['childViews'] = $v;
    }
    return $newArr;
}
?&gt;


This function uses reccursion to do the same as your code above. It takes one array of Key Value pairs and reassigns the values to wrap the old values into an array with the following format:

array ( 'type' =&gt; 'control', 'childViews' =&gt; $oldValue );


Basically, instead of nesting a new loop each time the depth of your input array changes like in your function above this function will just pass the old childValues back into itself and assign the result as the new childValues array.