Как сконвертировать многомерный ассоциативный массив в одномерный с сохранением пути?

Нужно чтобы работало вот так:

$nestedArray = [
    'firstLevel1' => [
        'secondLevel1' => [
            'thirdLevel1' => 'thirdLevel1 value'
        ],
        'secondLevel2' => 'secondLevel2 value'
    ],
    'firstLevel2' => 'firstLevel2 value'
];

var_export(toPseudoNestedAray($nestedArray));

//array (
//    'firstLevel1[secondLevel1][thirdLevel1]' => 'thirdLevel1 value',
//    'firstLevel1[secondLevel2]' => 'secondLevel2 value',
//    'firstLevel2' => 'firstLevel2 value'
//)


Как такое реализовать?
  • Вопрос задан
  • 364 просмотра
Решения вопроса 1
v3shin
@v3shin
Веб-шаман
Вы ищете extract()?

UPD:
Прошу прощения, не вчитался в вопрос.

function flattenArray($array, &$resultArray = [], $name = '')
{
    foreach($array as $key => $value) {
        if (is_array($value)) {
            flattenArray($value, $resultArray, $name ? $name."[$key]" : $key);
        } else {
            $resultArray[$name ? $name."[$key]" : $key] = $value;
        }
    }
    return $resultArray;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
Можно использовать dot-синтаксис для того чтобы из многомерного массива делать плоский.
В Laravel есть уже готовые хэлперы которые можно утянуть себе чтобы не изобретать велосипед

получится что-то на подобии
[
    'firstLevel1.secondLevel1.thirdLevel1' => 'thirdLevel1 value',
    'firstLevel1.secondLevel2' => 'secondLevel2 value'
]


array_dot() - многомерный в одномерный
код функции - https://github.com/rappasoft/laravel-helpers/blob/...

array_set() - одномерный в многомерный
код функции - https://github.com/rappasoft/laravel-helpers/blob/...
Ответ написан
Комментировать
Audiophile
@Audiophile Автор вопроса
Корявая, но реализация

function toPseudoNestedArray(array $array) {
    $result = [];
    $resultingKey = '';
    ($closure = function (array $array) use (&$result, &$resultingKey, &$closure) {
        foreach ($array as $key => $value) {
            if (is_array($value)) {
                $currentKey = $resultingKey;
                if ($resultingKey) {
                    $resultingKey .= '[' . $key . ']';
                } else {
                    $resultingKey .= $key;
                }
                $closure($value);
                $resultingKey = $currentKey;
            } else {
                $result[$resultingKey ? $resultingKey . '[' . $key . ']' : $key] = $value;
            }
        }
    })($array);

    return $result;
}


Если есть варианты поизящнее - буду рад другим ответам.
Ответ написан
Комментировать
0xD34F
@0xD34F
function createPlainArrayFromNested($arr, $path = []) {
  $result = [];

  foreach ($arr as $key => $val) {
    $path[] = count($path) ? "[$key]" : $key;

    $result += (is_array($val) && !empty($val))
      ? createPlainArrayFromNested($val, $path)
      : [ implode('', $path) => $val ];

    array_pop($path);
  }

  return $result;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы