【问题标题】:PHP convert deep array [duplicate]PHP转换深度数组[重复]
【发布时间】:2012-08-16 08:17:41
【问题描述】:

可能重复:
PHP Walk through multidimensional array while preserving keys

我有一个像这样的深数组:

array {
  ["key1"] => "A"
  ["key2"] => "B"
  ["key3"] => array {
                ["subkey1"] => "C"
                ["subkey2"] => array {
                                  ["subsubkey1"] => "D"
                               }
              }

}

我不知道这个数组会有多深。 现在我想将其转换为如下所示的数组:

array {
   array {
  ["key1"] => "A"
  ["key2"] => "B"
  ["key3.subkey1"] => "C"
  ["key3.subkey2.subsubkey1"] = > "D"
}

我该怎么做?我猜它需要递归?

【问题讨论】:

  • 是的,递归将是a处理它的好方法。你尝试过什么,你到底卡在哪里?
  • 请使用搜索,这已经被问及回答了。您可以使用递归或堆栈来做到这一点。
  • @hakra: 那里选择的答案非常不可读:-S 看起来它不像预期的那样工作
  • @hakra:我相信你可以自己解决你的答案 :-) 正如操作所提到的,它不适用于一种情况,它仍然是错误的

标签: php arrays recursion


【解决方案1】:

就这么简单

$array = array(
    'a' => array(
        'b' => array(
            'c' => 'val'
        ),
        'd' => 'val2'
    ),
    'e' => 'val3'
);

var_dump(collapse($array));

function collapse($array)
{
    $result = array();
    foreach ($array as $key => $val) {
        if (is_array($val)) {
            foreach (collapse($val) as $nested_key => $nested_val) {
                $result[$key . '.' . $nested_key] = $nested_val;
            }
        } else {
            $result[$key] = $val;
        }
    }

    return $result;
}

http://ideone.com/ieSZ6

PS:通常我不喜欢给出完整的解决方案,但在这种情况下 - 解决方案对于新手来说可能太难了

【讨论】:

    【解决方案2】:

    正如所写,这可以通过递归或使用堆栈来完成。这是使用堆栈的示例:

    $separator = '.';
    $flat = array();
    
    while ($array)
    {
        list($key, $value) = array(key($array), array_shift($array));
        if (is_array($value))
        {
            foreach($value as $subKey => $node)
                $array[$key.$separator.$subKey] = $node;
            continue;
        }
        $flat[$key] = $value;
    }
    

    然后结果在$flat 中,您的$array 数据如下:

    Array
    (
        [key1] => A
        [key2] => B
        [key3.subkey1] => C
        [key3.subkey2.subsubkey1] => D
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多