2010-01-26 6 views
154
$test = array('hi'); 
$test += array('test','oh'); 
var_dump($test); 

Cosa significa "+" per array in PHP?+ operatore per array in PHP?

+5

ho notato la tua domanda ha avuto '+ =' e la risposta accettata aveva '+'. Dai miei test sembrano comportarsi allo stesso modo. – user151841

+6

La [documentazione] (http://php.net/manual/en/language.operators.array.php) riassume abbastanza bene – artfulrobot

+1

possibile duplicato di [Riferimento: cosa significa questo simbolo in PHP?] (Http: //stackoverflow.com/questions/3737139/reference-what-does-this-symbol-mean-in-php) –

risposta

219

Citando dal PHP Manual on Language Operators

L'operatore + restituisce la matrice destra allegato al reticolo sinistro; per le chiavi che esistono in entrambi gli array, verranno utilizzati gli elementi dell'array di sinistra e gli elementi corrispondenti della matrice di destra verranno ignorati.

Quindi, se si fa

$array1 = ['one', 'two',   'foo' => 'bar']; 
$array2 = ['three', 'four', 'five', 'foo' => 'baz']; 

print_r($array1 + $array2); 

otterrete

Array 
(
    [0] => one // preserved from $array1 (left-hand array) 
    [1] => two // preserved from $array1 (left-hand array) 
    [foo] => bar // preserved from $array1 (left-hand array) 
    [2] => five // added from $array2 (right-hand array) 
) 

Così la logica della + è equivalente al seguente frammento:

$union = $array1; 

foreach ($array2 as $key => $value) { 
    if (false === array_key_exists($key, $union)) { 
     $union[$key] = $value; 
    } 
} 

Se siete interessati nei dettagli dell'attuazione del livello C. testa zione a


nota, che + è diverso da come array_merge() unirebbe gli array:

print_r(array_merge($array1, $array2)); 

darebbe

Array 
(
    [0] => one // preserved from $array1 
    [1] => two // preserved from $array1 
    [foo] => baz // overwritten from $array2 
    [2] => three // appended from $array2 
    [3] => four // appended from $array2 
    [4] => five // appended from $array2 
) 

Vedere pagine collegate per altri esempi.

+0

È l'ordine delle chiavi dopo l'operazione '+' garantita dalle ** specifiche **? – Pacerier

+1

@Pacerier PHP prodotto da php.net non ha una specifica formale, ma entrambe le chiamate '+' e 'array_merge'' zend_hash_merge' sono sotto il cofano. Questo è anche previsto, poiché gli array PHP sono implementati come mappe hash ordinate. – bishop

+0

@bishop, Non è il manuale di php.net le specifiche per PHP? – Pacerier

-1

Aggiungerà il nuovo array al precedente.

6

Questo operatore utilizza l'unione di due array (come array_merge, con la differenza che con le chiavi duplicate array_merge vengono sovrascritte).

La documentazione per gli operatori di array è here.

+1

Una parola di cautela per i principianti qui, il risultato dell'operazione è ** nullo ** se uno degli array è ** nullo **. Ad alcuni potrebbe non interessare questo presupposto poiché si tratta di un'operazione di unione, il risultato sarà l'array corretto (non nullo) se uno di essi è nullo. Ma ciò è vero se uno degli array è un array ** vuoto **. –

+0

Quindi, come buona pratica, penso che dovremmo inizializzare gli array di input come array vuoti. Voi ragazzi cosa dite? –

12

L'esempio migliore che ho trovato per l'utilizzo di questo è in un array di configurazione.

$user_vars = array("username"=>"John Doe"); 
$default_vars = array("username"=>"Unknown", "email"=>"[email protected]"); 

$config = $user_vars + $default_vars; 

Il $default_vars, come suggerisce, è la matrice di valori predefiniti. L'array $user_vars sovrascriverà i valori definiti in $default_vars. Eventuali valori mancanti in $user_vars sono ora i valori predefiniti vars da $default_vars.

Questo sarebbe print_r come:

Array(2){ 
    "username" => "John Doe", 
    "email" => "[email protected]" 
} 

Spero che questo aiuta!

-3
$var1 = "example"; 
$var2 = "test"; 
$output = array_merge((array)$var1,(array)$var2); 
print_r($output); 

Array ([0] => esempio [1] => test)

+0

Questo thread menziona alcune volte come array_merge() NON è congruente. – doublejosh

+0

@doublejosh, "congruente"? Senso? – Pacerier

+0

Non sono la stessa cosa. – doublejosh

5

attento con i tasti numerici, se devono essere conservati o se non si vuole perdere nulla

$a = array(2 => "a2", 4 => "a4", 5 => "a5"); 
$b = array(1 => "b1", 3 => "b3", 4 => "b4"); 

unione

print_r($a+$b); 
Array 
(
    [2] => a2 
    [4] => a4 
    [5] => a5 
    [1] => b1 
    [3] => b3 
) 

merge

print_r(array_merge($a, $b)); 
Array 
(
    [0] => a2 
    [1] => a4 
    [2] => a5 
    [3] => b1 
    [4] => b3 
    [5] => b4 
) 
+0

͏ + 1, buona presa. – Pacerier

3

L'operatore + produce gli stessi risultati di array_replace(). Tuttavia, poiché gli argomenti dell'operatore sono invertiti, anche l'ordinamento dell'array risultante può essere diverso.

Ampliando altro esempio a questa pagina:

$array1 = array('one', 'two', 'foo' => 'bar'); 
$array2 = array('three', 'four', 'five', 'foo' => 'baz'); 

print_r($array1 + $array2); 
print_r(array_replace($array2, $array1)); //note reversed argument order 

uscite:

Array 
(
    [0] => one // preserved from $array1 
    [1] => two // preserved from $array1 
    [foo] => bar // preserved from $array1 
    [2] => five // added from $array2 
) 
Array 
(
    [0] => one // preserved from $array1 
    [1] => two // preserved from $array1 
    [2] => five // added from $array2 
    [foo] => bar // preserved from $array1 
) 
+0

L'ordine di '+' è garantito dalle specifiche? Che dire di 'array_replace'? – Pacerier

0
  1. Array nonché l'uso del trattamento di tutte matrice come matrice associativa.
  2. Quando il conflitto tasto durante più, il valore a sinistra (precedente) siano mantenute

inserisco il codice qui sotto per rendere le cose chiare.

$a + $b = array_plus($a, $b)

function array_plus($a, $b){ 
    $results = array(); 
    foreach($a as $k=>$v) if(!isset($results[$k]))$results[$k] = $v; 
    foreach($b as $k=>$v) if(!isset($results[$k]))$results[$k] = $v; 
    return $results; 
} 
+0

@ L'esecuzione del codice di Tamlyn sembra dimostrare che il reclamo * "l'operazione array plus considera tutto l'array come array associato" * è errato. – Pacerier

+0

Il codice di Tamlyn ha dimostrato che ho ragione –