2016-02-22 14 views
6

Tôi có một số cấu hình mặc định và một số cấu hình cụ thể có thể định cấu hình được. Tôi cần phải hợp nhất các cấu hình cụ thể vào các cấu hình mặc định.PHP array_replace_recursive nếu vô hướng, array_merge_recursive nếu mảng

  • Trong trường hợp tùy chọn cấu hình cụ thể không tồn tại, tùy chọn mặc định sẽ được sử dụng.
  • Trong trường hợp đó, value là một đại lượng vô hướng, cấu hình cụ thể nên được áp dụng
  • Trong trường hợp đó, value là một mảng vô hướng, các mảng cần được sáp nhập và array_unique áp dụng.
  • Trong trường hợp value là mảng kết hợp, Chúng tôi cần áp dụng các quy tắc nêu trên scalarscalar_array.

Ví dụ:

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

Dự kiến ​​Output:

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

Có cách nào sạch đẹp đạt được điều này?

+0

Điều này thật thú vị, nếu tôi hiểu, bạn đang thử một cái gì đó giống như tệp cấu hình SublimeText (chỉ để làm cho nó rõ ràng)? – Asur

+0

Tôi nghĩ rằng bạn đã hiểu chính xác – Gravy

+0

Tôi sẽ sử dụng chức năng đệ quy tùy chỉnh, vì bạn có thể cần nhiều tính năng hơn các hàm đệ quy php có thể có. Nhưng dù sao tôi cá nhân tìm thấy nó hoàn toàn ok. – Asur

Trả lời

1

Trường hợp của tôi hơi khác một chút nhưng có thể sẽ hữu ích. Tôi cần phải thay thế scalars và array_merge_recursive trên mảng.

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

Chức năng này nhận được kết quả mong muốn của bạn. Nó cho rằng các kiểu cụ thể là các mạch lạc với các kiểu mặc định, do đó không có kiểm tra kết hợp nào được thực hiện. Chức năng lặp lại mảng cấu hình cụ thể và kiểm tra giá trị mặc định tương ứng : nếu nó là vô hướng, thay thế giá trị mặc định; nếu nó là một mảng được liệt kê , nó hợp nhất các giá trị duy nhất; nếu không, hàm gọi chính nó với các giá trị hiện tại làm đối số.

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

Gọi chức năng theo cách này:

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

$result, áp dụng cho mẫu mảng của bạn, là thế này:

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 
       (
       ) 
     ) 
) 

Với vài mảng này:

$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 là:

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 
       (
       ) 

     ) 

) 

Ghi chú:

Vâng, đây là một chút rời rạc: Tôi cảm thấy lặp tốt hơn thông qua mảng cụ thể (không phải mặt hàng tồn vẫn còn hoang sơ), nhưng thực hiện kiểm tra giá trị trên mảng mặc định, đó là điểm tham chiếu.

Kiểm tra mảng được liệt kê/liên kết dựa trên this answer.

Các vấn đề liên quan