2016-02-22 12 views
6

私はいくつかのデフォルト設定と、設定可能ないくつかの特定の設定を持っています。私は特定の構成をデフォルトの構成にマージする必要があります。具体的な設定オプションが存在しない場合には スカラーの場合はarray_replace_recursive、配列の場合はarray_merge_recursive

  • は、 デフォルトのオプションが使用されます。 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' => [ 
      ... 
     ] 
    ], 
]; 

予想される出力:

$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' => [ 
      ... 
     ] 
    ], 
]; 

これを達成するための素敵なきれいな方法はありますか?

+0

これは興味深いことですが、私が理解すれば、あなたはSublimeText設定ファイルのようなものを試しています。 – Asur

+0

私はあなたがそれを正確に理解したと思う。 – Gravy

+0

PHPの再帰関数よりも多くの機能が必要な場合があるので、私はカスタム再帰関数を使うだろう。しかし、とにかく私は個人的にそれが完全に大丈夫だとわかります。 – Asur

答えて

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

この関数は、目的の結果を取得します。特定の型はデフォルト型のコヒーレントであると仮定しているため、コヒーレンスチェックは実行されません。この関数は特定のコンフィギュレーション配列を繰り返し実行し、対応するデフォルト値を確認します:スカラーの場合はデフォルト値を置き換えます。列挙された配列の場合は、一意の値がマージされます。それ以外の場合は、現在の値を引数として関数自体を呼び出します。

このように関数を呼び出す
function fillConfig($default, $specific) 
{ 
    foreach($specific as $key=> $val) 
    { 
     if(isset($default[$key])) 
     { 
      if(! is_array($default[$key])) 
      { 
       $default[$key] = $val; 
      } 
      elseif(array_keys($default[$key]) === range(0, count($default[$key]) - 1)) 
      { 
       $default[$key] = array_unique(array_merge($default[$key], $val)); 
      } 
      else 
      { 
       $default[$key] = fillConfig($default[$key], $val); 
      } 
     } 
     else 
     { 
      // This happens when a specific key doesn't exists in default configuration. 
      // I think that in this case the value must be omitted, 
      // otherwise you can un-comment following line: 
      // $default[$key] = $val; 
     } 
    } 
    return $default; 
} 

:この配列のカップルと

Array 
(
    [scalar1] => A 
    [scalar2] => Apple 
    [array_scalar] => Array 
     (
      [0] => 3 
      [1] => 4 
      [2] => 5 
     ) 
    [array_associative] => Array 
     (
      [scalar] => 1 
      [array_scalar] => Array 
       (
        [0] => 1 
        [1] => 2 
        [2] => 3 
       ) 
      [array_associative] => 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' => B, 
     'array_scalar' => [3,4,5], 
     'array_associative' => [ 

     ] 
    ], 
]; 

$result = fillConfig($defaultConfigs, $specificConfigs); 

$resultは、これで、あなたの配列のサンプルに適用されます

$resultは:

Array 
(
    [scalar1] => A 
    [scalar2] => Apple 
    [array_scalar] => Array 
     (
      [0] => 3 
      [1] => 4 
      [2] => 5 
     ) 

    [array_associative] => Array 
     (
      [scalar] => B 
      [array_scalar] => Array 
       (
        [0] => 1 
        [1] => 2 
        [2] => 3 
        [4] => 4 
        [5] => 5 
       ) 

      [array_associative] => Array 
       (
       ) 

     ) 

) 

はい、このビットがインコヒーレントである:私は、特定の配列(存在しない項目はそのまま残りせず)を介して良好反復感じたが、値のチェックを行いますデフォルトの配列では、それは参照点です。

列挙型/連想配列チェックは、this answerに基づいています。

関連する問題