Предположим, что у меня есть следующая функция
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