Оптимизация создания многомерного массива

У меня есть список ключей массива и уровень вложенности в один массив, например:

$keys[0] = 'first';
$keys[1] = 'second';
$keys[2] = 'third';

Как я могу преобразовать это в многомерный массив в следующем формате:

$array['first']['second']['third'] = 'value';

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

$keyLen = count($keys);

if ($keyLen == 1) {
    $array[$keys[0]] = 'value;
} elseif ($keyLen == 2) {
    $array[$keys[0]][$keys[1]] = 'value;
} elseif ($keyLen == 3) {
    $array[$keys[0]][$keys[1]][$keys[2]] = 'value';
} ...

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

Какие ценности? Это статическая строка 'value'?

Dharman 04.01.2019 22:07

Где у тебя value? Это последний элемент в вашем массиве?

GasKa 04.01.2019 22:07

Я бы предложил рекурсивную функцию - но от последнего элемента (key2) до первого элемента (key0). Или, может быть, подойдет просто начало цикла с последнего элемента.

Jeff 04.01.2019 22:07

@Dharman Я сказал в конце вопроса, что значение не имеет значения. Я могу заполнить эту часть, это расположение клавиш, которое я не могу оптимизировать.

Matt K 04.01.2019 22:10
Стоит ли изучать 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
5
48
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

Вы можете вернуться назад по входному массиву и по ходу обернуть предыдущий результат:

$nested = 'value';
for (end($keys); key($keys)!==null; prev($keys)){
    $nested = [current($keys) => $nested];
}

В итоге $nested будет иметь желаемую структуру.

Несколько из них ответят на мой вопрос, но вы были первым. Это сработает!

Matt K 04.01.2019 23:08

Попробуйте. Здесь мы используем ссылки для укладки наших новых массивов.

<?php
$keys = array('first', 'second', 'third');
$array = array();
$current = &$array;
foreach($keys as $key => $value) {
    $current[$value] = array();
    $current = &$current[$value];
}
$current = 'Hello world!';
print_r($array);

Начиная с последнего элемента, вы можете пройти по массиву в цикле, выбрать последний и построить новый массив:

<?php
$keys[0] = 'first';
$keys[1] = 'second';
$keys[2] = 'third';

function createKey($array) {
    $b = "value";
    while(count($array)>0) {
      $key = array_pop($array);
      $b = [$key => $b];
    }
    return $b;
}

var_dump(createKey($keys));
// Output:
array(1) {
  ["first"]=>
  array(1) {
    ["second"]=>
    array(1) {
      ["third"]=>
      string(5) "value"
    }
  }
}

Другой вариант - зациклить перевернутые клавиши и обернуть предыдущий результат:

$array = [];
foreach(array_reverse($keys) as $key) {
    $temp = $array;
    unset($array[key($array)]);
    $array[$key] = $temp;
}

Затем вы можете установить свое значение:

$array['first']['second']['third'] = 'value';

Демо

Вы можете даже eval безопасно использовать это без утечки каких-либо входных данных в строку eval:

$value = 'value';
eval( '$array[$keys['. implode(']][$keys[', range(0, count($keys)-1)) . ']] = $value;' );

или с дополнительным счетчиком еще проще и короче:

$value = 'value';
$i     = 0;
eval( '$array' . str_repeat('[$keys[$i++]]', count($keys)) . ' = $value;' );

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