Вставка элементов в массив - PullRequest
       13

Вставка элементов в массив

3 голосов
/ 20 октября 2010

У меня есть массив с деревом конфигурации:

$cfg = array('global' => array(
    'project'       => 'foo',
    'base_url'      => '/path/',
    'charset'       => 'utf-8',
    'timezone'      => 'Europe/Lisbon',
    'environment'   => 'development'),
    //...
);

Мне нужно вставить элемент в дерево (или, возможно, изменить его) с учетом таких строк, как "global:project" и "bar", где сначала указываетсяпуть к элементу и второе его значение.Таким образом, значение 'foo' в $cfg['global']['project'] станет 'bar'.

Вот функция, которая мне нужна:

function set_cfg($path, $value)
{ /* Alter $cfg with the given settings */ }

Итак, я начинаю с разрыва строки пути с ':'и иметь массив с ключами пути:

$path = explode(':', $path)

Что дальше?Как определить (рекурсивно?) Операцию вставки ключей в массив $cfg?

Ответы [ 4 ]

2 голосов
/ 20 октября 2010
function set_cfg($path, $value) {
    $path = explode(':', $path);
    $current = &$GLOBALS['cfg']; // variable is global, so get from $GLOBALS
    foreach ($path as $part) {
        $current = &$current[$part];
    }
    $current = $value;
}

Если вы можете быть уверены, что всегда будет только два уровня конфигурации, вы можете вместо этого использовать:

function set_cfg($path, $value) {
    list($first, $second) = explode(':', $path, 2);
    $GLOBALS['cfg'][$first][$second] = $value;
}
2 голосов
/ 20 октября 2010

Добавьте массив в качестве ссылочного аргумента функции, затем выполните рекурсивный анализ, передавая фрагмент массива, который вы хотите дополнительно изучить. Когда вы дойдете до конца, остановитесь (и назначьте значение клавише).

1 голос
/ 20 октября 2010

Это может звучать безумно, но примерно так:

eval("\$cfg['".str_replace(':', "']['", $path)."'] = ".var_export($value, true).';');
0 голосов
/ 20 октября 2010

Я бы построил цикл, который проходит через каждый элемент пути, когда в конце присваивается значение.

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

$node=$cfg;
$i=0;
while($i<count($path)-1)
{
  $node = $node[$path[$i]];
  i++;
}

$node[$path[$i]]=$value;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...