PHP: как переписать значения в одном массиве со значениями из другого без добавления новых ключей в массив?

У меня есть массив с настройками по умолчанию и один массив с заданными пользователем настройками. Я хочу объединить эти два массива, чтобы настройки по умолчанию были перезаписаны указанными пользователем.

Я попытался использовать array_merge, который выполняет переписывание, как я хочу, но он также добавляет новые параметры, если пользователь указал параметры, которых нет в стандартных. Есть ли более эффективная функция, которую я могу использовать для этого, чем array_merge? Или есть функция, которую я могу использовать для фильтрации заданного пользователем массива, так что он содержит только ключи, которые также существуют в массиве настроек по умолчанию?

Пример того, что я хочу

$default = array('a' => 1, 'b' => 2);
$user = array('b' => 3, 'c' => 4);

// Somehow merge $user into $default so we end up with this:
Array
(
    [a] => 1
    [b] => 3
)

Ответ 1

Вы можете просто добавить два массива вместе ($user+$default) вместо использования array_merge.

Если вы хотите остановить любые пользовательские настройки, которые не существуют в значениях по умолчанию, вы можете использовать array_intersect_key:

Возвращает ассоциативный массив, содержащий все записи массива, которые имеют ключи, присутствующие во всех аргументах

Пример:

$default = array('a' => 1, 'b' => 2);
$user = array('b' => 3, 'c' => 4);

// add any settings from $default to $user, then select only the keys in both arrays
$settings = array_intersect_key($user + $default, $default);

print_r($settings);

Результаты:

Array
(
    [b] => 3
    [a] => 1
)

Ключи/значения (и порядок) сначала выбираются из $user, поэтому b предшествует a в массиве, в $user нет a. Любые ключи, не определенные в $user, которые определены в $default, будут добавлены в конец $user. Затем вы удаляете любые клавиши в $user + $default, которые не определены в $default.

Ответ 2

Вероятно, проще всего просто перебрать ключи в массиве настроек по умолчанию, если вы только захотите их рассмотреть. Итак, вы можете сделать что-то вроде этого:

foreach ($default_settings AS $key => $default_value)
{
    if (array_key_exists($key, $user_settings))
    {
        $combined_settings[$key] = $user_settings[$key];
    }
    else
    {
        $combined_settings[$key] = $default_value;
    }
}

Ответ 3

foreach($default as $key=>$val){   
  if (isset($user[$key]))
  {
    $settings[$key] = $user[$key];
  } else {
    $settings[$key] = $default[$key];
  } 
}

Я думаю, что это то, что вы хотите.

Ответ 4

foreach($user_settings as $key=>$val){   
    $global_settings[$key] = $val; 
}

?