У меня есть строка вроде этого:
$string = 'one/two/three/four';
который я превращаю в массив:
$keys = explode('/', $string);
Этот массив может иметь любое количество элементов, например 1, 2, 5 и т. Д.
Как назначить определенное значение многомерному массиву, но использовать созданные мной $keys
чтобы идентифицировать позицию, в которую нужно вставить?
Подобно:
$arr['one']['two']['three']['four'] = 'value';
Извините, если вопрос запутан, но я не знаю, как объяснить это лучше
Это вроде нетривиально, потому что вы хотите вложить, но это должно выглядеть примерно так:
function insert_using_keys($arr, $keys, $value){ // we're modifying a copy of $arr, but here // we obtain a reference to it. we move the // reference in order to set the values. $a = &$arr; while( count($keys) > 0 ){ // get next first key $k = array_shift($keys); // if $a isn't an array already, make it one if(!is_array($a)){ $a = array(); } // move the reference deeper $a = &$a[$k]; } $a = $value; // return a copy of $arr with the value set return $arr; }
$string = 'one/two/three/four'; $keys = explode('/', $string); $arr = array(); // some big array with lots of dimensions $ref = &$arr; while ($key = array_shift($keys)) { $ref = &$ref[$key]; } $ref = 'value';
Что это делает:
$ref
для отслеживания ссылки на текущее измерение $arr
. $keys
одному, ссылаясь на элемент $key
текущей ссылки. Вам нужно сначала убедиться, что ключ существует, а затем назначить значение. Что-то вроде этого должно работать (непроверено):
function addValueByNestedKey(&$array, $keys, $value) { $branch = &$array; $key = array_shift($keys); // add keys, maintaining reference to latest branch: while(count($keys)) { $key = array_pop($keys); if(!array_key_exists($key, $branch) { $branch[$key] = array(); } $branch = &$branch[$key]; } $branch[$key] = $value; } // usage: $arr = array(); $keys = explode('/', 'one/two/three/four'); addValueByNestedKey($arr, $keys, 'value');
это банально, но:
function setValueByArrayKeys($array_keys, &$multi, $value) { $m = &$multi foreach ($array_keys as $k){ $m = &$m[$k]; } $m = $value; }