Преобразовать в массив
Есть такие входные данные:
$key = "level1[level2][level3]";
$val = ["foo", "bar"];
Нужно, используя ключ, преобразовать в такой вид:
$result = [
"level1" => [
"level2" => [
"level3" => ["foo", "bar"]
]
]
];
Как это сделать? Может быть есть какая-то встроенная или библиотечная функция?
Ответы (3 шт):
Готовой функции нет, явно нужно писать самому. Если прямо вот под такие условия, то примерно вот так.
<?php
$key = "level1[level2][level3]";
$val = ["foo", "bar"];
function apply( $matches, $val ) {
$result = [];
if ( is_array( $matches ) && count( $matches ) > 0 ) {
$key = $matches[0][0];
array_shift( $matches );
$result[$key] = apply( $matches, $val );
} else { $result = $val; }
return $result;
}
if ( preg_match_all("/(\S+?)\[(\S+)\]\[(\S+)\]/", $key, $matches) && is_array($matches) && count($matches) > 1 ) {
array_shift( $matches );
$result = apply( $matches, $val );
}
var_dump( $result );
Результат
array(1) {'level1' => array(1) { 'level2' => array(1) {'level3' => array(2) {[0] => string(3) "foo", [1] => string(3) "bar" } } } }
Спасибо phpBear. Но я сделал более простое решение:
$key = "level1[level2][level3]";
$val = ["foo", "bar"];
parse_str($key, $res);
array_walk_recursive($res, function (&$child) use ($val) {
if ($child === "") {
$child = $val;
}
}, $val);
var_dump($res);
как вариант
function makeArray($key, $val){
$result = [];
$path = explode('[', str_replace("]", "", $key));
$res = &$result;
foreach($path as $p){
$res[$p] = [];
$res = &$res[$p];
}
$res = $val;
return $result;
}