PHP array_replace_recursive如果是标量,则array_merge_recursive如果是数组

Gra*_*avy 7 php arrays recursion scalar array-merge

我有一些默认配置,以及一些可配置的特定配置.我需要将特定配置合并到默认配置中.

  • 如果特定配置选项不存在,将使用默认选项.
  • value是标量的情况下,应该应用特定配置
  • 如果value是标量数组,则应合并数组并应用array_unique.
  • 在该情况下value是一个关联数组,我们需要应用上面scalarscalar_array规则.

例:

$defaultConfigs = [
   'scalar1' => 1,
   'scalar2' => "Apple",
   'array_scalar' => [3,4,5],
   'array_associative' => [
      'scalar' => 1,
      'array_scalar' => [1,2,3],
      'array_associative' => [
          ...
      ]
   ],
];

$specificConfigs = [
   'scalar1' => "A",                          
   'array_scalar' => [3,4,5],   
   'array_associative' => [
      'scalar' => 1,
      'array_scalar' => [1,2,3],
      'array_associative' => [
          ...
      ]
   ],
];
Run Code Online (Sandbox Code Playgroud)

预期产出:

$expectedConfigs = [
   'scalar1' => "A",                  // Overridden
   'scalar2' => "Apple",              // Default used
   'array_scalar' => [1,2,3,4,5],     // Scalar merged and array_unique
   'array_associative' => [
      'scalar' => "B",                // Overridden
      'array_scalar' => [1,2,3,4,5],  // Scalar merged and array_unique
      'array_associative' => [
          ...
      ]
   ],
];
Run Code Online (Sandbox Code Playgroud)

有一个很好的清洁方式来实现这一目标吗?

Nic*_*las 1

我的情况略有不同,但可能会有所帮助。我需要替换数组上的标量和 array_merge_recursive 。

class ArrayUtil {

    public static function mergeRecursive(array $array1, $array2) {
        if($array2 && is_array($array2)) {
            foreach($array2 as $key => $val2) {
                if (is_array($val2) && (null!==($val1 = isset($array1[$key]) ? $array1[$key] : null)) && is_array($val1)) {
                    $array1[$key] = self::mergeRecursive($val1,$val2);
                } else {
                    $array1[$key] = $val2;
                }
            }
        }
        return $array1;
    }
}
Run Code Online (Sandbox Code Playgroud)