【问题标题】:How can I convert a string with square brackets into an array?如何将带方括号的字符串转换为数组?
【发布时间】:2019-02-01 01:27:21
【问题描述】:

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

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 可以将此字符串识别为数组?

【问题讨论】:

  • 你试过了吗
  • 我看到了这个stackoverflow.com/questions/24440020/…,但我不能使用json_decode,因为我的字符串没有逗号。
  • 我也尝试使用该字段的id,如下所示:id="field-a-2-b-0-c-1-field_name by using (explode('-',$id)); 但问题是结果没有嵌套
  • $filed = 数组“字段[a][2][b][0][c][1][field_name] => 值”; dd($filed);
  • 谢谢你dejavuguy,让我试试。 did 命令有什么用?

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


【解决方案1】:

如果您希望结果嵌套,请使用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

【讨论】:

  • parse_str 函数用于解析 URL 的查询字符串。我觉得这样用可能不太靠谱。
  • 在我看来,这正是用例parse_str 的用途。该字符串源自 html 文本输入属性 name
【解决方案2】:

你可以用正则表达式获取括号中的值,然后将其缩减为你想要的数组:

$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] 具有我们的第一个也是唯一一个捕获组的值。我们只对捕获组值感兴趣。

然后使用array_reduce 函数,我们可以简单地以相反的顺序遍历键,并将我们的值顺序包装到一个数组中。

【讨论】:

  • 非常好。我在正则表达式上苦苦挣扎。+1
【解决方案3】:

您可以使用explode 功能来做到这一点。但是这些值之间应该有空格,例如“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);

【讨论】:

  • 谢谢Balaji,但这不会使数组嵌套,对吧?
  • 是的,不是。我认为 Rei, sn-ps 会做你正在寻找的确切工作。
【解决方案4】:

使用此测试代码在我的 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 需要额外的代码来解决他/她的问题并不是很清楚。

【讨论】:

    【解决方案5】:

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

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

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

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

    结果:

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

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多