Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 遍历嵌套数组并转换某些值_Php_Arrays_Multidimensional Array - Fatal编程技术网

Php 遍历嵌套数组并转换某些值

Php 遍历嵌套数组并转换某些值,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我正在寻找一个干净的解决方案来转换嵌套数组 这就是我想要达到的目标 原始阵列: $map = array( 'name' => 'super test', 'machine_name' => 'super_test', 'class' => 'openlayers_map_map', 'options' => array( 'width' => 'auto', 'height' => '300px',

我正在寻找一个干净的解决方案来转换嵌套数组

这就是我想要达到的目标

原始阵列:

  $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',
      ),
    )
  );
  $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',
      ),
    )
  );
最终阵列:

  $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',
      ),
    )
  );
  $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',
      ),
    )
  );

基本上,我需要遍历数组,找到具有“class”键的所有子级,并将它们转换为同名对象。

这个完全未经测试的递归函数可能会让您走上正确的道路:

function recursive_hydrate_array($arr)
{
  if(!is_array($arr) || !isset($arr["class"]))
  {
    throw new Exception("Argument is not an array or does not have a 'class' key.");
  }

  $klass = $arr["class"];
  unset($arr["class"]);

  $obj = new $klass();

  foreach($arr as $k => $v)
  {
    if(is_array($arr[$k]) && isset($arr[$k]["class"]))
    {
      $obj->{$k} = recursive_hydrate_array($arr[$k]);
    }
    else
    {
      $obj->{$k} = $arr[$k];
    }
  }

  return $obj;
}
请注意,我在这里做了三个假设:

  • 所讨论的类已经存在
  • 每个类都可以实例化,而无需向其构造函数传递任何参数
  • 每个类的所有相关属性都是公共的,可以从类外部进行设置

  • 如果您还没有准备好实例化类,那么这段代码将创建匿名对象。(类名仍作为属性存在。)

    结果:

    (请注意,第一个数组变成了一个对象,因为它也包含字段“class”。如果您不希望出现这种行为,我想您可以很容易地调整函数)