У меня есть массив с настройками по умолчанию и один массив с указанными пользователями настройками. Я хочу объединить эти два массива так, чтобы настройки по умолчанию были перезаписаны с указанными пользователями.
Я попытался использовать 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
)
Фактически вы можете просто сложить два массива ( $ user + $ default
) вместо использования array_merge
.
Если вы хотите остановить любые пользовательские настройки, которых нет в значениях по умолчанию, вы можете использовать array_intersect_key
:
Возвращает ассоциативный массив, содержащий все записи array1, которые имеют ключи, присутствующие в все аргументы
$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
в массиве нет a
в $ user
. Любые ключи, не определенные в $ user
, которые являются , определенными в $ default
, затем будут добавлены в конец $ user
. Затем вы удаляете все ключи в $ user + $ default
, которые не определены в $ default
.
foreach($default as $key=>$val){
if (isset($user[$key]))
{
$settings[$key] = $user[$key];
} else {
$settings[$key] = $default[$key];
}
}
Я думаю, это то, что вам нужно.
Вероятно, проще всего просто перебирать ключи в массиве default-settings, если вы хотите учитывать только их. Таким образом, вы можете сделать что-то вроде этого:
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;
}
}
foreach($user_settings as $key=>$val){
$global_settings[$key] = $val;
}
?