如何轻松地将 $x['a']['b']['c'] = d 转换为 $x['a.b.c'] = d

How to convert $x['a']['b']['c'] = d to $x['a.b.c'] = d easily

我有一个多级数组字段需要通过表单提交。不确定什么是最简单的解决方案:

由于php会自动将点号转换为下划线,所以我将其更改为数组:

$form['a.b_b.c'] ==> <input name="a[b_b][c]" value="$form[a.b_b.c]">

$_POST[a][b_b][c] 正确。

但是,在没有太多循环的情况下,将此 $_POST 值分配回原始 $form['a.b_b.c'] 的最简单方法是什么?例如

$form['a.b_b.c'] = $_POST['a']['b_b']['c'];

或者有更好的步行方式吗?

非常接近这个问题,但还没有: Convert dot syntax like "this.that.other" to multi-dimensional array in PHP

这是我目前的解决方案:

foreach ($form as $k) {
    $form[$k] = assign_val($_POST, $k);
}

function assign_val($arr = [], $key = '') {
    $keys = explode('.', $key);
    $val = &$arr;
    foreach ($keys as $k) {
        $val = &$val[$k];
    }
    return $val;
}

我会有一个函数 flatten 并执行类似的操作:

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

然后你可以做:

$form = flatten($_POST);