Как в PHP динамически создать многомерный массив?

Допустим, есть массив ключей $k=array(1,2,3)
Есть многомерный массив $a;
Как сделать так, что бы в значение массива $a[1][2][3] записать, скажем, 1, а если такого пути ключей нет - то создать и записать, используя только массив ключей $k?
  • Вопрос задан
  • 4398 просмотров
Решения вопроса 2
happyproff
@happyproff
Счастливый веб-разработчик
/**
 * @param array $array
 * @param array $keyPath
 * @param $value
 *
 * @return array
 * @throws InvalidArgumentException
 */
function addValueToArrayByKeyPath ($array, $keyPath, $value) {

    if (!is_array($array)) throw new \InvalidArgumentException;

    $level =& $array;
    foreach ($keyPath as $key) {
        if (!array_key_exists($key, $level) or !is_array($level[$key])) {
            $level[$key] = [];
        }
        $level =& $level[$key];
    }
    $level = $value;

    return $array;

}


$array = [
    1 => [
        2 => [],
        9 => [],
    ]
];
$keyPath = [1, 2 ,3];


$array = addValueToArrayByKeyPath($array, $keyPath, 42);
var_dump($array);

/* output:
array (size=1)
  1 =>
    array (size=2)
      2 =>
        array (size=1)
          3 => int 42
      9 =>
        array (size=0)
          empty
*/
Ответ написан
@iamnothing
Если я вас правильно понял:

function arrayToNestedKeys(array $keys, array $insertInto, $value) {
    $tmp = &$insertInto;
    foreach ($keys as $key) {
        if (!isset($tmp[$key]) || !is_array($tmp[$key])) {
            $tmp[$key] = [];
        }
        $tmp[$key] = [];
        $tmp = &$tmp[$key];
    }
    $tmp = $value;

    return $insertInto;
}

// arrayToNestedKeys([78,2,3], [123], 6) выдаст
//   [0 => 123, 78 => [2 => [3 => 6]]]

Upd: Подкорректировал решение - добавил проверку на существование массива во время прокладывания "пути" в массиве. Спасибо @happyproff
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
shcherbanich
@shcherbanich
Программист
Не совсем понял, что вы хотите. Вот первое что в голову пришло)
$k=array(4,5,3);
foreach($k as $key=>$val)
	$str[] = "[$val]";
$str = '$a'.implode('',$str).'=array();';

eval($str);
print_r($a);
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы