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;
}
?