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