+ operatore per array in PHP?


192
$test = array('hi');
$test += array('test','oh');
var_dump($test);

Cosa +significa array in PHP?


5
Ho notato che la tua domanda aveva +=e la risposta accettata aveva +. Dai miei test sembrano comportarsi allo stesso modo.
user151841

7
La documentazione lo riassume abbastanza bene
artfulrobot il


@RobbieAverill: questa è la domanda a cui fa riferimento quella domanda di riferimento. Quindi, se qualcosa che la domanda di riferimento è il duplicato
icc97

2
Qualcun altro è leggermente inorridito dal fatto che una cosa così fondamentale come la concatenazione di array debba essere eseguita array_merge? È come se gli array fossero di default array associativi e gli array numerici fossero cittadini di seconda classe.
icc97,

Risposte:


271

Citando dal Manuale PHP sugli operatori linguistici

L'operatore + restituisce l'array di destra aggiunto all'array di sinistra; per le chiavi esistenti in entrambi gli array, verranno utilizzati gli elementi dell'array di sinistra e gli elementi corrispondenti dell'array di destra verranno ignorati.

Quindi se lo fai

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

Quindi la logica di +è equivalente al seguente frammento:

$union = $array1;

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

Se sei interessato ai dettagli dell'implementazione di livello C vai a


Si noti che +è diverso da come array_merge()combinare le matrici:

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

ti darei

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
)

Vedi le pagine collegate per ulteriori esempi.


1
@Pacerier PHP prodotto da php.net non ha una specifica formale, ma sia l' +e array_mergechiamata zend_hash_mergesotto il cofano. Questo è anche previsto, poiché in PHP gli array sono implementati come mappe hash ordinate.
vescovo,

1
@Pacerier I documenti online di php.net sono il record più vicino a una specifica, ma IMO quei documenti non raggiungono una specifica vera: uno, vengono aggiornati dopo la scrittura del codice; due, non sono scritti per coprire ogni uso speciale.
vescovo,

14
Il comportamento di PHP di +e array_mergeè perverso e poco intuitivo. Sono l'opposto di ciò che una lettura in semplice inglese ti direbbe intuitivamente che farebbe l'aggiunta o la fusione di array. Altre lingue / librerie usano +per concatenare elenchi (ad esempio in Python) e "unire" le funzioni per aggiungere le coppie chiave / valore da un oggetto a un altro (ad esempio in lodash). Eppure in PHP è il contrario; array_mergepuò essere utilizzato per concatenare matrici simili a elenchi ma +non può. Diversamente array_merge, +esegue sempre l'operazione che verrebbe chiamata "unione" in qualsiasi altra lingua.
Mark Amery,

1
@ icc97 sono davvero solo HashMaps. Vedi nikic.github.io/2014/12/22/…
Gordon

2
Ho provato a inviare un bug per vedere se array_concatfosse possibile creare un alias array_merge.
icc97,

18

Il miglior esempio 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"=>"no-reply@domain.com");

$config = $user_vars + $default_vars;

La $default_vars, come suggerisce, è la matrice di valori predefiniti. L' $user_varsarray sovrascriverà i valori definiti in $default_vars. Tutti i valori mancanti in $user_varssono ora le impostazioni predefinite var $default_vars.

Questo sarebbe print_rcome:

Array(2){
    "username" => "John Doe",
    "email" => "no-reply@domain.com"
}

Spero che aiuti!


6

Questo operatore accetta l'unione di due array (uguale a array_merge, tranne che con le chiavi duplicate array_merge vengono sovrascritte).

La documentazione per gli operatori dell'array è disponibile qui .


1
Un avvertimento per i principianti qui, il risultato dell'operazione è nullo se uno qualsiasi 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 null) se uno di essi è null. Ciò è vero se uno degli array è un array vuoto .
Sandeepan Nath,

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

5

Attento con i tasti numerici, se devono essere conservati o se non vuoi 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
)

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.

Espandendo su un altro esempio da 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
)

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

1
  1. L'operazione array plus considera tutti gli array come array assoc.
  2. Quando la chiave è in conflitto durante il segno più, il valore sinistro (precedente) verrà mantenuto

Pubblico il codice qui sotto per chiarire le cose.

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

L'esecuzione del codice di @ Tamlyn sembra dimostrare che la richiesta "array plus operazione tratta tutti gli array come assoc array" è errata.
Pacerier,

@Pacerier quella chiave potrebbe anche essere intera.
Hitesh


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

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


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

@doublejosh, "congruente"? Senso?
Pacerier,

1
Non sono gli stessi.
doublejosh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.