Как я могу преобразовать строку в квадратных скобках в массив? - PullRequest
0 голосов
/ 26 августа 2018

Я получил это из атрибута имени поля

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 голосов
/ 26 августа 2018

При тестировании вашей проблемы на моем PHP-сервере с этим тестовым кодом

<code><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']);
?>

Я получил следующий ответ (после ввода слова «привет» в текстовое поле и нажатия кнопки «ОК»):

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

По общему признанию, это было отформатировано лучше, но я отправляю сообщение со своего смартфона, поэтому, пожалуйста, прости меня за то, что я не отформатировал его снова вручную.

Итак, мне не совсем понятно, зачем ОП нужен дополнительный код для решения его / ее проблемы.

0 голосов
/ 26 августа 2018

Вот ваше решение: https://codebrace.com/editor/b06588218

Я использовал совпадение регулярных выражений дважды, чтобы сопоставить имя переменной и массивы

/[(.+?)]/ соответствует любым значениям в массиве, где "?"ленивое совпадениев то время как следующее регулярное выражение /^[^[]+/ соответствует имени переменной.

Я использовал переменные переменной для создания переменной из строки, извлеченной сверху регулярного выражения

Результат:

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

                                        )

                                )

                        )

                )

        )

)

Надеюсь, это поможет

0 голосов
/ 26 августа 2018

Вы можете получить значения в скобках с регулярным выражением, а затем уменьшить его до нужного массива:

$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 мы можем просто просматривать ключи в обратном порядке и последовательно переносить наше значение в массив.

0 голосов
/ 26 августа 2018

Если вы хотите, чтобы результат был вложенным, используйте 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

0 голосов
/ 26 августа 2018

Вы можете использовать функцию разнесения, чтобы сделать это.Но значения должны иметь пробел между ними, например «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);
...