dongnan4571
2014-09-13 18:54
浏览 38
已采纳

遍历嵌套数组并转换一些值

I'm looking for a clean solution to transform a nested array.

Here is what I'm trying to achieve...

Original array:

  $map = array(
    'name' => 'super test',
    'machine_name' => 'super_test',
    'class' => 'openlayers_map_map',
    'options' => array(
      'width' => 'auto',
      'height' => '300px',
      'contextualLinks' => 1,
      'provideBlock' => 1,
      'view' => array(
        'center' => array(
          'lat' => '0',
          'lon' => '0',
        ),
        'rotation' => '0',
        'zoom' => '2',
      ),
      'layers' => array(
        '0' => array(
          'name' => 'Ma super layer',
          'machine_name' => 'plouf',
          'class' => 'openlayers_layer_tile',
          'options' => array(
            'source' => array(
              'name' => 'Ma super layer',
              'machine_name' => 'plouf',
              'class' => 'openlayers_source_osm'
            ),
            'param1' => 'ca roule'
          )
        ),
      ),
      'controls' => array(
        'control_mouseposition',
        '0' => array(
          'name' => 'Control attribution',
          'machine_name' => 'openlayers_control_attribution',
          'class' => 'openlayers_control_attribution',
          'options' => array(
            'collapsible' => 1
          )
        ),
        'control_rotate',
        'control_zoom',
      ),
      'interactions' => array(
        'interaction_doubleclickzoom',
        'interaction_dragpan',
        'interaction_dragrotateandzoom',
        'interaction_mousewheelzoom',
      ),
    )
  );

Final array:

  $map = array(
    'name' => 'super test',
    'machine_name' => 'super_test',
    'class' => 'openlayers_map_map',
    'options' => array(
      'width' => 'auto',
      'height' => '300px',
      'contextualLinks' => 1,
      'provideBlock' => 1,
      'view' => array(
        'center' => array(
          'lat' => '0',
          'lon' => '0',
        ),
        'rotation' => '0',
        'zoom' => '2',
      ),
      'layers' => array(
        '0' => (object) openlayers_layer_tile
          'name' => 'Ma super layer',
          'machine_name' => 'plouf',
          'class' => 'openlayers_layer_tile',
          'options' => array(
            'source' => (object) openlayers_source_osm
              'name' => 'Ma super layer',
              'machine_name' => 'plouf',
              'class' => 'openlayers_source_osm'
            ),
            'param1' => 'ca roule'
          )
        ),
      ),
      'controls' => array(
        'control_mouseposition',
        '0' => (object) openlayers_control_attribution
          'name' => 'Control attribution',
          'machine_name' => 'openlayers_control_attribution',
          'class' => 'openlayers_control_attribution',
          'options' => array(
            'collapsible' => 1
          )
        ),
        'control_rotate',
        'control_zoom',
      ),
      'interactions' => array(
        'interaction_doubleclickzoom',
        'interaction_dragpan',
        'interaction_dragrotateandzoom',
        'interaction_mousewheelzoom',
      ),
    )
  );

Basically, I need to traverse the array, find all children with the 'class' key and transform them into objects of the same name.

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

2条回答 默认 最新

  • dongran1779 2014-09-13 19:32
    最佳回答

    If you don't have the classes ready to be instantiated, this code will create anonymous objects instead. (The class name still being present as a property.)

    function class_to_object (&$arr) {
    
      if (is_array($arr)) {
        foreach ($arr as $key => &$val) {
          class_to_object($val);
        }
    
        if (isset($arr['class'])) {
          $arr = (object) $arr;
        }
      }
    
    }
    
    class_to_object($map);
    

    Result :

    (Notice that the first array is turned into an object, since it contains the field "class" too. I guess you can tweak the function easily enough if you don't want that behavior)

    stdClass Object
    (
        [name] => super test
        [machine_name] => super_test
        [class] => openlayers_map_map
        [options] => Array
            (
                [width] => auto
                [height] => 300px
                [contextualLinks] => 1
                [provideBlock] => 1
                [view] => Array
                    (
                        [center] => Array
                            (
                                [lat] => 0
                                [lon] => 0
                            )
    
                        [rotation] => 0
                        [zoom] => 2
                    )
    
                [layers] => Array
                    (
                        [0] => stdClass Object
                            (
                                [name] => Ma super layer
                                [machine_name] => plouf
                                [class] => openlayers_layer_tile
                                [options] => Array
                                    (
                                        [source] => stdClass Object
                                            (
                                                [name] => Ma super layer
                                                [machine_name] => plouf
                                                [class] => openlayers_source_osm
                                            )
    
                                        [param1] => ca roule
                                    )
    
                            )
    
                    )
    
                [controls] => Array
                    (
                        [0] => stdClass Object
                            (
                                [name] => Control attribution
                                [machine_name] => openlayers_control_attribution
                                [class] => openlayers_control_attribution
                                [options] => Array
                                    (
                                        [collapsible] => 1
                                    )
    
                            )
    
                        [1] => control_rotate
                        [2] => control_zoom
                    )
    
                [interactions] => Array
                    (
                        [0] => interaction_doubleclickzoom
                        [1] => interaction_dragpan
                        [2] => interaction_dragrotateandzoom
                        [3] => interaction_mousewheelzoom
                    )
    
            )
    
    )
    
    评论
    解决 无用
    打赏 举报
查看更多回答(1条)

相关推荐 更多相似问题