#php #arrays #merge
#php #массивы #слияние
Вопрос:
У меня есть массив, содержащий некоторые настройки по умолчанию для моего плагина. По мере развития плагина настройки могут быть удалены или добавлены от версии к версии.
Вот пример массива по умолчанию:
$defaults = array(
'setting1' => 'somevalue',
'setting2' => 'somevalue',
'setting4' => 'somevalue',
);
Вот пример данных настроек в реальном времени, которые необходимо обновить для новой структуры $default:
$livesettings = array(
'setting1' => 'foo',
'setting2' => 'bar',
'setting3' => 'foobar',
);
Я ищу функцию, с помощью которой я могу передавать оба массива, а структура настроек жизни обновляется в соответствии с $ defaults.
Итак, в данном случае в livesettings:
- настройки 1 и настройки2 не затронуты. Их значения остаются неизменными
- параметр setting3 удален, поскольку больше не нужен
- параметр 4 добавляется со значением по умолчанию
somevalue
Есть ли у них какие-либо функции в PHP, которые могут сделать это за один раз? Если да, то что это? Если нет, то как бы мне достичь этого с помощью PHP-кода?
Комментарии:
1. по сути, вы хотите объединить 2 массива. попробуйте добавить механизм кэширования, поскольку я не думаю, что они меняются так часто
2. Ваш вопрос сбивает с толку, я ожидал, что $ livesettings будет фактическим набором данных, который вы создаете, потому что вы добавляете параметр 4, но тогда почему параметр 3 удален?
3. Представьте используемый плагин. Администратор плагина устанавливает настройки для этого плагина, хранящиеся в $livesettings. Я публикую новую версию плагина, которая больше не использует / нуждается в setting3, но теперь имеет setting4. Мне нужно обновить настройки пользователей, чтобы они соответствовали этой новой структуре, без сброса исходных настроек uses.
Ответ №1:
Требуется комбинация array_intersect_key() и array_merge().
$livesettings = array_intersect_key($livesettings, $defaults);
$livesettings = array_merge($defaults, $livesettings);
Первая функция удалит все ключи, не найденные в $defaults
, в то время как вторая добавит элементы из $defaults
, не найденные в $livesettings
Ответ №2:
для решения этой проблемы вам не нужна функция, вы также можете использовать $ defaults как базовый массив,
$defaults = array(
'setting1' => 'somevalue',
'setting2' => 'somevalue',
'setting4' => 'somevalue',
);
$livesettings = $defaults; // it will be copited by value,
$livesettings['setting1'] = 'overriden setting 1';
$livesettings['setting3'] = 'added new setting to live config';
Комментарии:
1. Я не хочу, чтобы значения $ livesettings переопределялись значениями $ defaults. Я просто хочу, чтобы ключевая структура отображалась из defaults в $ livesettings
2. переопределение предназначено только для массива $livesettings, $default не будет изменен.
3. Извините, вы полностью упускаете суть. Понятно, что мой вопрос, я чувствую, мог бы быть немного более ясным.