Мой вопрос в том, как правильно конвертировать из одного элемента массива ['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;
}
Где я терплю неудачу и почему, пожалуйста, скажите мне. благодарю вас.






Все закончилось легко, баг был на стыковке случайных элементов, если его массив или нет, или просто какой-то фейлер.
/**
* @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;
}
Сработало правильно, спасибо Илья!
Я дал попытка. Осталось только соединить и разровнять, может пригодится?