Как установить глубокий массив в PHP

Предположим, что у меня есть следующая функция

function setArray(&$array, $key, $value) { $array[$key] = $value; } 

В приведенной выше функции ключ находится только на первом уровне, что, если я хочу установить ключ на 2-м или 3-м уровнях, как переписать функцию?

например

  $array['foo']['bar'] = 'test'; 

Я хочу использовать ту же функцию для установки значения массива

Это должно работать. С помощью этой функции вы можете установить любой элемент массива на любую глубину, передав одну строку, содержащую ключи, разделенные символом .

 function setArray(&$array, $keys, $value) { $keys = explode(".", $keys); $current = &$array; foreach($keys as $key) { $current = &$current[$key]; } $current = $value; } 

Вы можете использовать это следующим образом:

 $array = Array(); setArray($array, "key", Array('value' => 2)); setArray($array, "key.test.value", 3); print_r($array); 

вывод:

 Array ( [key] => Array ( [value] => 2 [test] => Array ( [value] => 3 ) ) ) 

Вы можете использовать array_merge_recursive

 $array = array("A" => "B"); $new['foo']['bar'] = 'test'; setArray($array, $new); var_dump($array); 

Вывод

 array (size=2) 'A' => string 'B' (length=1) 'foo' => array (size=1) 'bar' => string 'test' (length=4) 

Используемая функция

 function setArray(&$array, $value) { $array = array_merge_recursive($array, $value); } 

эта функция должна это делать, ключ должен быть массивом, например array ('foo', 'bar')

 function setArray(&$array, array $keys, $value) { foreach($keys as $key) { if(!isset($array[$key])) { $array[$key] = array(); } $array = &$array[$key]; } $array = $value; } $arr = array(); setArray($arr, array('first', 'second'), 1); var_dump($arr); // dumps array(1) { ["first"]=> array(1) { ["second"]=> int(1) } } 

Протестировано и работает.

Именно так:

 function setArray(&$array, $key1, $key2, $value) { $array[$key1][$key2] = $value; } 

Но почему вы хотите использовать функцию? Используя его вот так:

 setArray($array, 'foo', 'bar', 'test'); 

требуется больше времени, чтобы написать что-то вроде этого:

 $array[1][2] = 'test'; 

Используйте array_replace_recursive вместо array_merge_recursive поскольку он правильно обрабатывает сценарий с одним ключом. См. https://3v4l.org/2ICmo