Intereting Posts

Динамические ключи массива

У меня есть строка вроде этого:

$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; }