Конкретная функция для массива Unflatten

Мой вопрос в том, как правильно конвертировать из одного элемента массива ['a_b_c' => 123] to ['a' => ['b' => ['c' => 123]]]; with any level!

В качестве примера входных данных (в тестах) я использую ['a_a' => '2', 'a_b' => '333', 'c_c' => '123'] в качестве разделителя ключей я выбираю '_'

И ждем результата типа:
['a' => ['a' => '2', 'b' => '333'], 'c' => ['c' => '123']

но фактический результат: ['a' => ['b' => '333'], 'c' => ['c' => '123']]

я использую статическую функцию из класса Helper:

 /**
     * @param array|string $data Inserted data, like regular array, or simple string(will return as is)
     * @param string $separator string separator to know what we had.
     * @return array|string
     */
    public static function unFlatArr($data, $separator = '_')
    {
        $return = [];

        if (is_iterable($data)) {
            foreach ($data as $oldKey => $value) {
                $keysArr = explode($separator, $oldKey, 2);
                $key = $keysArr[0];
                $k = $keysArr[1] ?? null;

                if (null !== $k) {
                    //got nesting.
                    $value = self::unFlatAr([$k => $value], $separator);
                }
                $return[$key] = $value;
            }

        } else {
            $return = $data;
        }

        return $return;
    }

Где я терплю неудачу и почему, пожалуйста, скажите мне. благодарю вас.

Я дал попытка. Осталось только соединить и разровнять, может пригодится?

Jaquarh 08.05.2022 22:49
Преобразование точечного синтаксиса, такого как «this.that.other», в многомерный массив в PHP вызывается так: 3v4l.org/lVZjF или для передачи всего массива, вот так: 3v4l.org/N1vmF
mickmackusa 16.05.2022 00:40
Стоит ли изучать 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 и хотите разрабатывать...
1
2
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Все закончилось легко, баг был на стыковке случайных элементов, если его массив или нет, или просто какой-то фейлер.

    /**
     * @param array|string $data Inserted data, like regular array, or simple string(will return as is)
     * @param string $separator string separator to know what we had.
     * @return array|string
     */
    public static function unFlatArr($data, $separator = '_')
    {
        $return = [];

        if (is_iterable($data)) {
            foreach ($data as $oldKey => $value) {
                $keysArr = explode($separator, $oldKey, 2);
                $key = $keysArr[0];
                $k = $keysArr[1] ?? null;

                if (null !== $k) {
                    //got nesting.
                    $value = self::unFlatAr([$k => $value], $separator);
                }
                $return[$key] = is_array($return[$key] ?? null) ? array_merge($return[$key], $value) : $value;
            }

        } else {
            $return = $data;
        }

        return $return;
    }

Сработало правильно, спасибо Илья!

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