0

可能重复:
PHP 在保留键的同时遍历多维数组

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

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"
}

我该怎么做?我想它需要一个递归?

4

2 回答 2

2

简单到

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

于 2012-08-16T08:23:21.423 回答
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
)
于 2012-08-16T08:30:04.590 回答