Ключи динамического массива


У меня есть строка, подобная этой:

$string = 'one/two/three/four';

Который я превращаю в массив:

$keys = explode('/', $string);

Этот массив может содержать любое количество элементов, например 1, 2, 5 и т.д.

Как я могу присвоить определенное значение многомерному массиву, но использовать $keys, который я создал выше, для определения позиции, в которую нужно вставить?

Например:

$arr['one']['two']['three']['four'] = 'value';

Извините, если вопрос сбивает с толку, но я не знаю, как объяснить это лучше

Author: Alex, 2011-09-22

4 answers

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

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;
}
 14
Author: Mark Elliot, 2011-09-22 01:07:05
$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 текущей ссылки.
  • Установка значения для окончательной ссылки.
 6
Author: FtDRbwLXw6, 2011-09-22 01:09:25

Сначала вам нужно убедиться, что ключ существует, а затем присвоить значение. Что-то вроде этого должно работать (непроверено):

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');
 1
Author: Hamish, 2011-09-22 01:07:34

Это банально, но:

function setValueByArrayKeys($array_keys, &$multi, $value) {
     $m = &$multi
     foreach ($array_keys as $k){
         $m = &$m[$k];
     }
     $m = $value;
}
 1
Author: MattoTodd, 2011-09-22 01:32:01