如何使用动态变量键名创建数组

时间:2018-11-23 10:05:12

标签: php

我有一个带有动态字段名称的表单

例如

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <form method="POST" action="result.php?r=1542967950">
        <input type="text" name="name[]" value="name 1">
        <input type="text" name="user[first][name][]" value="user first name 1">
        <input type="text" name="user[last][name][]" value="user last name 1">
        <input type="text" name="name[]" value="name 2">
        <input type="text" name="user[first][name][]" value="user first name 2">
        <input type="text" name="user[last][name][]" value="user last name 2">
        <button type="submit">go</button>
    </form>
</body>
</html>

字段名称是通过设置生成的,如果我转储帖子内容,它将是:

array(2) {
  ["name"]=>
  array(2) {
    [0]=>
    string(6) "name 1"
    [1]=>
    string(6) "name 2"
  }
  ["user"]=>
  array(2) {
    ["first"]=>
    array(1) {
      ["name"]=>
      array(2) {
        [0]=>
        string(17) "user first name 1"
        [1]=>
        string(17) "user first name 2"
      }
    }
    ["last"]=>
    array(1) {
      ["name"]=>
      array(2) {
        [0]=>
        string(16) "user last name 1"
        [1]=>
        string(16) "user last name 2"
      }
    }
  }
}

我的目标是创建一个新数组,其结构如下:

$datas[0]['name'] = 'name 1';
$datas[0]['user']['first']['name'] = 'first name 1';
$datas[0]['user']['last']['name'] = 'first name 1';
$datas[1]['name'] = 'name 2';
$datas[1]['user']['first']['name'] = 'first name 2';
$datas[1]['user']['last']['name'] = 'first name 2';

array(2) {
  [0]=>
  array(2) {
    ["name"]=>
    string(6) "name 1"
    ["user"]=>
    array(2) {
      ["first"]=>
      array(1) {
        ["name"]=>
        string(12) "first name 1"
      }
      ["last"]=>
      array(1) {
        ["name"]=>
        string(12) "first name 1"
      }
    }
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(6) "name 2"
    ["user"]=>
    array(2) {
      ["first"]=>
      array(1) {
        ["name"]=>
        string(12) "first name 2"
      }
      ["last"]=>
      array(1) {
        ["name"]=>
        string(12) "first name 2"
      }
    }
  }
}

PHP将使用字段名称中的[]符号来解析该字段,为避免错误的结果,我认为是像<input type="text" name="user-first-name[]" value="user first name 1">这样的表单名称,但我无法弄清楚最后一个过程  使user-first-name$data[$i]['user']['first']['name']

1 个答案:

答案 0 :(得分:1)

您需要使用explode()将字符串转换为数组,并使用array_reverse()将其反转,然后使用array_reduce()创建目标结构数组。

$str = "user-first-name";
$arr = array_reverse(explode('-', $str));
$newArr = [array_reduce($arr, function($carry, $item){
    return !count($carry) ? [$item => 'value'] : [$item => $carry];
})];

结果

Array
(
  [0] => Array
    (
      [user] => Array
        (
          [first] => Array
            (
               [name] => value
            )

        )
    )
)

demo中查看实时结果