拼合多维数组连接键

J. *_*uni 24 php arrays flatten multidimensional-array

可能重复:
PHP将嵌套数组转换为单个数组,同时连接键?
递归获取数组的键并创建下划线分隔字符串

请在回答之前阅读整个问题.

我有这个多维数组:

$data = array(
    'user' => array(
        'email'   => 'user@example.com',
        'name'    => 'Super User',
        'address' => array(
            'billing' => 'Street 1',
            'delivery' => 'Street 2'
        )
    ),
    'post' => 'Hello, World!'
);
Run Code Online (Sandbox Code Playgroud)

我希望它变平,变成:

$data = array(
    'user.email' => 'user@example.com',
    'user.name'  => 'Super User',
    'user.address.billing'  => 'Street 1',
    'user.address.delivery' => 'Street 2',
    'post'       => 'Hello, World!'
);
Run Code Online (Sandbox Code Playgroud)

重要:

  • 钥匙对我来说非常重要.我希望它们连接起来,用句点分隔.

  • 它应该适用于任何级别的嵌套.

谢谢!

Fel*_*ing 62

这样的事情应该有效:

function flatten($array, $prefix = '') {
    $result = array();
    foreach($array as $key=>$value) {
        if(is_array($value)) {
            $result = $result + flatten($value, $prefix . $key . '.');
        }
        else {
            $result[$prefix . $key] = $value;
        }
    }
    return $result;
}
Run Code Online (Sandbox Code Playgroud)

DEMO


J. *_*uni 17

感谢所有给出的答案.

我在下面改进了它,这是一个改进版本.它不需要根前缀,不需要使用引用,读取更清晰,并且它有一个更好的名称:

function array_flat($array, $prefix = '')
{
    $result = array();

    foreach ($array as $key => $value)
    {
        $new_key = $prefix . (empty($prefix) ? '' : '.') . $key;

        if (is_array($value))
        {
            $result = array_merge($result, array_flat($value, $new_key));
        }
        else
        {
            $result[$new_key] = $value;
        }
    }

    return $result;
}
Run Code Online (Sandbox Code Playgroud)


Bas*_*sti 6

试试这个

<?php

$data = array(
    'user' => array(
        'email'   => 'user@example.com',
        'name'    => 'Super User',
        'address' => array(
            'billing' => 'Street 1',
            'delivery' => 'Street 2'
        )
    ),
    'post' => 'Hello, World!'
);

function prefixKey($prefix, $array)
{
    $result = array();
    foreach ($array as $key => $value)
    {
        if (is_array($value))
            $result = array_merge($result, prefixKey($prefix . $key . '.', $value));
        else
            $result[$prefix . $key] = $value;
    }   
    return $result;
}

var_dump(prefixKey('', $data));

?>
Run Code Online (Sandbox Code Playgroud)

输出

array
  'user.email' => string 'user@example.com' (length=16)
  'user.name' => string 'Super User' (length=10)
  'user.address.billing' => string 'Street 1' (length=8)
  'user.address.delivery' => string 'Street 2' (length=8)
  'post' => string 'Hello, World!' (length=13)
Run Code Online (Sandbox Code Playgroud)