Как разгладить массив в PHP: методы и примеры кода

Метод 1: использование рекурсивной функции

function unflattenArray($array) {
    $result = array();
    foreach ($array as $key => $value) {
        $keys = explode('.', $key);
        $currentArray = &$result;
        foreach ($keys as $nestedKey) {
            if (!isset($currentArray[$nestedKey])) {
                $currentArray[$nestedKey] = array();
            }
            $currentArray = &$currentArray[$nestedKey];
        }
        $currentArray = $value;
    }
    return $result;
}
// Example usage
$flattenedArray = array(
    'person.name' => 'John Doe',
    'person.age' => 30,
    'person.address.city' => 'New York',
    'person.address.country' => 'USA'
);
$unflattenedArray = unflattenArray($flattenedArray);
print_r($unflattenedArray);

Метод 2: использование цикла

function unflattenArray($array) {
    $result = array();
    foreach ($array as $key => $value) {
        $keys = explode('.', $key);
        $currentArray = &$result;
        foreach ($keys as $nestedKey) {
            if (!isset($currentArray[$nestedKey])) {
                $currentArray[$nestedKey] = array();
            }
            $currentArray = &$currentArray[$nestedKey];
        }
        $currentArray = $value;
    }
    return $result;
}
// Example usage
$flattenedArray = array(
    'person.name' => 'John Doe',
    'person.age' => 30,
    'person.address.city' => 'New York',
    'person.address.country' => 'USA'
);
$unflattenedArray = unflattenArray($flattenedArray);
print_r($unflattenedArray);

Метод 3: использование библиотеки (например, компонента Symfony PropertyAccess)

use Symfony\Component\PropertyAccess\PropertyAccess;
function unflattenArray($array) {
    $result = array();
    $accessor = PropertyAccess::createPropertyAccessor();
    foreach ($array as $key => $value) {
        $accessor->setValue($result, $key, $value);
    }
    return $result;
}
// Example usage
$flattenedArray = array(
    'person.name' => 'John Doe',
    'person.age' => 30,
    'person.address.city' => 'New York',
    'person.address.country' => 'USA'
);
$unflattenedArray = unflattenArray($flattenedArray);
print_r($unflattenedArray);