У меня есть следующий многомерный ассоциативный массив, я пытаюсь рекурсивно пройти по нему и создать массив с каждым элементом родительского дерева
Входной массив:
$user = [
'profile' => [
'authkey' => '',
'publickey' => '',
'status' => 19
],
'setup' => [
'profile' => false,
'contact' => false,
'payments' => false,
'subscription' => false
],
'paygateway' => [
'paypal' => [
'publickey' =>'',
'secretkey' => '',
'testarray' => [
'key1' => 'value1',
'key2' => 'value2',
'key3' => [
'key4' => 'level4'
]
],
'webhookid' => ''
],
'stripe' => [
'publickey' => '',
'secretkey' => ''
]
]
];
Требуемый результат:
array (
'profile' =>
array (
0 => '[profile][authkey]',
1 => '[profile][publickey]',
2 => '[profile][status]',
),
'setup' =>
array (
0 => '[setup][profile]',
1 => '[setup][contacts]',
2 => '[setup][payments]',
3 => '[setup][subscriptions]',
),
'paygateway' =>
array (
0 => '[paygateway][paypal][publickey]',
1 => '[paygateway][paypal][secretkey]',
2 => '[paygateway][paypal][testarray][key1]',
3 => '[paygateway][paypal][testarray][key2]',
4 => '[paygateway][paypal][testarray][key3][key4]',
5 => '[paygateway][paypal][webhookid]',
6 => '[paygateway][stripe][publickey]',
7 => '[paygateway][stripe][secretkey]',
),
)
Что у меня уже есть:
Следующая функция, которая отлично проходит по всему дереву массива:
function testArray($array){
foreach($array as $key => $value){
if (is_array($value)){
echo "$key <br/>";
testArray($value);
}else{
echo "$key : $value <br/>";
}
}
}
testArray($user);
Я не могу понять, как сложить ключи из структуры и построить выходной массив.






Чтобы сохранить исходные ключи первого уровня, я рекомендую передавать каждое значение первого уровня в рекурсивную функцию.
В рекурсивной функции создайте отформатированную строку пути к ключу по мере того, как вы условно проходите глубже по подмассивам. Возвращайте заполненные ключевые пути на каждом уровне и проталкивайте все более глубокие заполненные пути при восхождении по дереву.
Что касается строки array_push(), она используется для индивидуального добавления всех элементов из возвращаемого результата более глубокого уровня к результату текущего уровня. Можно было бы написать так:$result = array_merge($result, buildKeyPath($value, "{$path}[$key]"));
но я считаю, что данные, «распространяющиеся» с помощью array_push(), более показательны для типа выполняемого процесса.
Код: (Демо)
function buildKeyPath(array $array, string $path): array
{
$result = [];
foreach ($array as $key => $value) {
if (is_array($value)) {
array_push($result, ...buildKeyPath($value, "{$path}[$key]"));
} else {
$result[] = "{$path}[$key]";
}
}
return $result;
}
foreach ($user as $k => &$v) {
$v = buildKeyPath($v, "[$k]");
}
var_export($user);
/* commented code */ на демонстрации.
Я смог пройти другую часть, над которой работал. Буду рад, если вы поможете мне только с этим stackoverflow.com/questions/74049005/…
Привет, не могли бы вы сделать это с помощью array_merge, я пытался, но получил нежелательные результаты. также что, если у меня есть пара ключей в корневой структуре, где значение является не массивом, а простым значением? Я борюсь с другой вещью, с которой мне, вероятно, скоро понадобится помощь.