Рекурсивный обход многомерного ассоциативного массива и создание ключевых строк пути

У меня есть следующий многомерный ассоциативный массив, я пытаюсь рекурсивно пройти по нему и создать массив с каждым элементом родительского дерева

Входной массив:

$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);

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы сохранить исходные ключи первого уровня, я рекомендую передавать каждое значение первого уровня в рекурсивную функцию.

В рекурсивной функции создайте отформатированную строку пути к ключу по мере того, как вы условно проходите глубже по подмассивам. Возвращайте заполненные ключевые пути на каждом уровне и проталкивайте все более глубокие заполненные пути при восхождении по дереву.

Что касается строки 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);

Привет, не могли бы вы сделать это с помощью array_merge, я пытался, но получил нежелательные результаты. также что, если у меня есть пара ключей в корневой структуре, где значение является не массивом, а простым значением? Я борюсь с другой вещью, с которой мне, вероятно, скоро понадобится помощь.

Zubair Ahmd 12.10.2022 19:12
С помощью array_merge() Пожалуйста, предложите мне гиперссылку на демонстрацию 3v4l с вашими новыми, сложными образцами данных и объясните желаемый результат, как /* commented code */ на демонстрации.
mickmackusa 12.10.2022 21:52

Я смог пройти другую часть, над которой работал. Буду рад, если вы поможете мне только с этим stackoverflow.com/questions/74049005/…

Zubair Ahmd 13.10.2022 04:08

Другие вопросы по теме