如何将带有方括号的字符串转换为数组?

时间:2018-08-26 05:49:00

标签: php arrays multidimensional-array advanced-custom-fields

我是从字段的名称属性中获得的

name="field[a][2][b][0][c][1][field_name]"

序列化表格后,我得到了:

array('field[a][2][b][0][c][1][field_name]'=>'value')

,我需要将其转换为以下数组:

$field = array (
         'a' => array (
                [2] => array (
                       'b' => array (
                              [0] => array (
                                     'c' => array (
                                            [1] => array (
                                                 'field_name'=>'value'
                                            )
                                      )
                               )
                        )
                  )
           )
    );

我是否需要某种foreach函数或php可以将该字符串识别为数组?

5 个答案:

答案 0 :(得分:4)

如果要嵌套结果,请使用parse_str()

$text = "field[a][2][b][0][c][1][field_name]=value";
parse_str($text, $result);
print_r($result);

输出:

Array
(
    [field] => Array
        (
            [a] => Array
                (
                    [2] => Array
                        (
                            [b] => Array
                                (
                                    [0] => Array
                                        (
                                            [c] => Array
                                                (
                                                    [1] => Array
                                                        (
                                                            [field_name] => value
                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

)

请参见https://3v4l.org/7nmFT

答案 1 :(得分:1)

您可以使用正则表达式将括号中的值获取,然后将其简化为所需的数组:

Sub Float()
    Dim Result As Single
    Result = 10 / 3
    MsgBox Result
End Sub

说明

在正则表达式$key = 'field[a][2][b][0][c][1][field_name]'; $value = 'value'; $matches = array(); preg_match_all('/\[([^[]+)\]/', $key, $matches); $keys = array_reverse($matches[1]); $result = array_reduce($keys, function ($array, $item) { return array($item => $array); }, $value); 中:

  • \[([^[]+)\]与除左括号(一个或多个)之外的任何符号匹配
    次,并将其放入捕获组(我希望您不会有嵌套的括号);
  • ([^[]+)实际上在括号内匹配。

\[...\]函数应使用以下数据填充preg_match_all数组:

$matches

Array ( [0] => Array ( [0] => [a] [1] => [2] [2] => [b] [3] => [0] [4] => [c] [5] => [1] [6] => [field_name] ) [1] => Array ( [0] => a [1] => 2 [2] => b [3] => 0 [4] => c [5] => 1 [6] => field_name ) ) 的值是完全匹配的,而$matches[0]的值是我们的第一个也是唯一的捕获组。我们只对捕获组值感兴趣。

然后使用$matches[1]函数,我们可以简单地以相反的顺序遍历键,然后将我们的值依次包装到数组中。

答案 2 :(得分:0)

您可以使用爆炸功能执行此操作。但是这些值之间应有空格,例如“ Hello World”,其中的值将位于Array ( [0] => Hello [1] => world )中,但在您的情况下,就像Array ( [0] => field[a][2][b][0][c][1][field_name] )一样,直到$ name为字符或单词。

$name="field[a][2][b][0][c][1][field_name]"
$name_array = explode(" ",$name);
print_r ($name_array);

答案 3 :(得分:0)

这是您的解决方案: https://codebrace.com/editor/b06588218

我使用过两次正则表达式匹配来匹配变量名和数组

/[(.+?)]/ 匹配数组中“?”的任何值是惰性匹配。 在遵循正则表达式时 /^[^[]+/与变量名称匹配。

我用variable variables从上面的正则表达式提取的字符串中创建变量

结果:

Array
(
    [a] => Array
        (
            [2] => Array
                (
                    [b] => Array
                        (
                            [0] => Array
                                (
                                    [c] => Array
                                        (
                                            [1] => Array
                                                (
                                                    [field_name] => value
                                                )

                                        )

                                )

                        )

                )

        )

)

我希望这对您有帮助

答案 4 :(得分:0)

使用此测试代码在我的PHP服务器上测试问题时

<form method="post">
<input type="text" name="field[a][2][b][0][c][1][field_name]">
<input type="submit" value="OK">
<form>
<pre>
<?php
if (isset($_POST['field']))
    print_r($_POST['field']);
?>
</pre>

我收到以下答复(在文本框中输入单词“ hello”并单击“确定”按钮之后):

Array ( [a] => Array ( [2] => Array ( [b] => 
        Array ( [0] => Array ( [c] => Array ( [1] => 
        Array ( [field_name] => hello ) ) ) ) ) ) ) 

诚然,它的格式更好,但是我是从智能手机发布的,所以请原谅我不要手动对其进行格式化。

因此,对我来说,尚不清楚为什么OP需要额外的代码来解决他/她的问题。