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
)
11
задан Svish 15 May 2010 в 10:07
поделиться

4 ответа

Фактически вы можете просто сложить два массива ( $ 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 .

21
ответ дан 3 December 2019 в 04:51
поделиться
foreach($default as $key=>$val){   
  if (isset($user[$key]))
  {
    $settings[$key] = $user[$key];
  } else {
    $settings[$key] = $default[$key];
  } 
}

Я думаю, это то, что вам нужно.

1
ответ дан 3 December 2019 в 04:51
поделиться

Вероятно, проще всего просто перебирать ключи в массиве 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;
    }
}
1
ответ дан 3 December 2019 в 04:51
поделиться
foreach($user_settings as $key=>$val){   
    $global_settings[$key] = $val; 
}

?

0
ответ дан 3 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: