【问题标题】:How to convert $x['a']['b']['c'] = d to $x['a.b.c'] = d easily如何轻松地将 $x['a']['b']['c'] = d 转换为 $x['a.b.c'] = d
【发布时间】:2017-06-25 09:47:52
【问题描述】:

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

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

【问题讨论】:

  • 不是 100% 你想要的,但也许 extract() 会帮助你? php.net/manual/en/function.extract.php
  • 也许您可以向我们展示表格并更好地解释问题
  • 我想建议将标题改为"如何将['a'=>['b'=>['c'=>'d']]] 转换为[ 'abc'=>'d'] 轻松"

标签: php arrays assign


【解决方案1】:

我将有一个函数 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);

【讨论】:

  • 我不想要所有的_POST,只需要$form中存在key
  • @SIDU 您可以只调用array_intersect_key 以仅获取两个数组中都存在键的值,然后使用array_merge 合并这些值。像这样:array_merge($form, array_intersect_key(flatten($_POST), $form));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2019-07-03
相关资源
最近更新 更多