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

Допустим, есть массив ключей $k=array(1,2,3)
Есть многомерный массив $a;
Как сделать так, что бы в значение массива $a[1][2][3] записать, скажем, 1, а если такого пути ключей нет - то создать и записать, используя только массив ключей $k?
  • Вопрос задан
  • 3567 просмотров
Решения вопроса 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
scherbanich
@scherbanich
Программист
Не совсем понял, что вы хотите. Вот первое что в голову пришло)
$k=array(4,5,3);
foreach($k as $key=>$val)
	$str[] = "[$val]";
$str = '$a'.implode('',$str).'=array();';

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

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

Войти через TM ID
Похожие вопросы
Zaymigo Нижний Новгород
от 20 000 до 100 000 руб.
Devmasterz Тюмень
от 80 000 до 120 000 руб.
18 июля 2018, в 22:20
4000 руб./за проект
18 июля 2018, в 21:54
1000 руб./в час