PHP использует массив по умолчанию, чтобы правильно структурировать текущий массив

#php #arrays #merge

#php #массивы #слияние

Вопрос:

У меня есть массив, содержащий некоторые настройки по умолчанию для моего плагина. По мере развития плагина настройки могут быть удалены или добавлены от версии к версии.

Вот пример массива по умолчанию:

 $defaults = array(
                    'setting1' => 'somevalue',
                    'setting2' => 'somevalue',
                    'setting4' => 'somevalue',
                  );
  

Вот пример данных настроек в реальном времени, которые необходимо обновить для новой структуры $default:

 $livesettings = array(
                        'setting1' => 'foo',
                        'setting2' => 'bar',
                        'setting3' => 'foobar',
                      );
  

Я ищу функцию, с помощью которой я могу передавать оба массива, а структура настроек жизни обновляется в соответствии с $ defaults.

Итак, в данном случае в livesettings:

  1. настройки 1 и настройки2 не затронуты. Их значения остаются неизменными
  2. параметр setting3 удален, поскольку больше не нужен
  3. параметр 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. Извините, вы полностью упускаете суть. Понятно, что мой вопрос, я чувствую, мог бы быть немного более ясным.