2013-05-06 20 views

Odpowiedz

12

Nie jestem pewien, czy któraś z tych odpowiedzi ci pomaga (nie pomogły mi), szczególnie w przypadku, gdy twoimi "defualtami" mogą być tablice asocjacyjne o więcej niż jednym poziomie głębokości.

Myślę, że to, czego szukasz, to array_replace_recursive.
$finalArray = array_replace_recursive(array $defaults, array $inputOptions)

heres przykład, który pobiera opcjonalny wachlarz opcji do funkcji i robi niektóre przetwarzania na podstawie wyników tych opcji „opts” i defaults którym należy podać:

function do_something() { 
    $args = func_get_args(); 
      $opts = $args[0] ? $args[0] : array(); 

    $defaults = array(
     "second_level" => array(
        "key1" => "val1", 
        "key2" => "val2" 
       ), 
     "key1" => "val1", 
     "key2" => "val2", 
     "key3" => "val3" 
    ); 

    $params = array_replace_recursive($defaults, $opts); 
    // do something with these merged parameters 
} 

Sprawdź to z here

+0

To byłoby świetnie! TY – Orangeman555

0

Można po prostu zrobić coś jak

foreach($array1 as $key=>$value) $array2[$key]=$value; 
+0

Ponieważ będzie to działać w większości przypadków, bezpośrednio zastępuje '$ array2', która w tym przypadku jest" tablicą domyślną ". Może to być lub nie być zamierzonym zachowaniem. –

1

array_merge() jest dokładnie to, czego szukasz.

+0

jest niepoprawny, array_merge doda dowolny klucz do innej niż domyślna tablicy i możesz otrzymać klucze niedostępne w domyślnej tablicy –

+0

@RiccardoGalli klucze niedostępne w domyślnej tablicy i tak nie są używane, nie widzę tego jako kwestia. –

+0

Jest to bardziej przeznaczone dla tablic jednowymiarowych lub przy przepisywaniu domyślnej wartości tablicowej w zupełności, jeśli podana wartość jest zamierzonym zachowaniem. Sidenote: wydajność mówiąca w PHP 5.6 szybciej "foreach", w PHP 7 prawie nie ma różnicy. –

1
$defaults = array(
    'some_key_1'=>'default_value_1', 
    'some_key_2'=>'default_value_2', 
); 

$inputs = array_merge($defaults, $inputs) 
+0

to prawie nie dodaje nowych wglądów do istniejących odpowiedzi. – cfrick

+0

Doceniam to, że można kopiować i wklejać, aby użyć tego –

+0

Jeśli tablica $ inputs zawiera klucze spoza tablicy $ defaults, zostaną one dodane w wyniku, co jest błędne. –

0

jeśli po prostu chcesz zachować opcje, które można oczekiwać i wyrzucić resztę można użyć kombinacji array_merge i array_intersect_key.

<?php 

function foo($options) { 
    $defaults = [ 
     'a' => 1, 
     'b' => null, 
    ]; 

    $mergedParams = array_merge(
     $defaults, 
     array_intersect_key($options, $defaults) 
    ); 

    return $mergedParams; 
} 


var_dump(foo([ 
    'a' => 'keep me', 
    'c' => 'discard me' 
])); 

// => output 
// 
// array(2) { 
// ["a"]=> 
// string(7) "keep me" 
// ["b"]=> 
// NULL 
// } 

Jeśli zamiast tego chcesz zachować dodatkowy klucz, to znaczy, że array_merge($defaults, $options) wystarczy.

+1

Tak, ta odpowiedź jest w moim guście :) Również podoba mi się notatka, którą dodałeś, że to tylko jeśli chcesz usunąć dodatkowe klawisze :) PS: Dodałem linki do dokumentów;) –