Combina due array


88

Ho due array come questo:

array( 
'11' => '11',
'22' => '22',
'33' => '33',
'44' => '44'
);

array( 
'44' => '44',
'55' => '55',
'66' => '66',
'77' => '77'
);

Voglio combinare questi due array in modo che non contenga duplicati e conservi le loro chiavi originali. Ad esempio, l'output dovrebbe essere:

array( 
'11' => '11',
'22' => '22',
'33' => '33',
'44' => '44',
'55' => '55',
'66' => '66',
'77' => '77'
);

Ho provato questo ma sta cambiando le loro chiavi originali:

$output = array_unique( array_merge( $array1 , $array2 ) );

Qualche soluzione?

Risposte:


161

Usa solo:

$output = array_merge($array1, $array2);

Questo dovrebbe risolverlo. Perché usi le chiavi stringa se una chiave ricorre più di una volta (come '44'nel tuo esempio) una chiave sovrascriverà quelle procedenti con lo stesso nome. Perché nel tuo caso hanno entrambi lo stesso valore comunque non importa e rimuoverà anche i duplicati.

Aggiornamento: mi sono appena reso conto che PHP tratta le chiavi delle stringhe numeriche come numeri (interi) e quindi si comporterà in questo modo, il che significa che rinumera anche le chiavi ...

Una soluzione alternativa è ricreare le chiavi.

$output = array_combine($output, $output);

Aggiornamento 2: dimentico sempre che c'è anche un operatore (in grassetto, perché è proprio quello che stai cercando!: D)

$output = $array1 + $array2;

Tutto questo può essere visto in: http://php.net/manual/en/function.array-merge.php


5
@KingCrunch - Anche se i numeri sono citati, quelli non sono chiavi di stringa e quindi l'indice non verrà preservato. Esempio: ideone.com/I2NFT
Brendan Bullen

1
Davvero ... Prima volevo parlare di "un bug", ma poi ho notato che il manuale parla solo di "tasti numerici", non di "chiavi intere". Sembra un po 'confuso.
KingCrunch

+1 Mi sono dimenticato dell'operatore! Eccellente (metti quella parte in grassetto!;))
Brendan Bullen il

3
Quindi $array1 + $array2è una soluzione breve ed efficiente invece della array_merge() - array_combine()combinazione
Awan

2
AVVERTIMENTO! per array non associati o se gli array hanno chiavi comuni$a + $b != array_merge($a, $b)
jmarceli

33

Dovresti prenderlo in considerazione $array1 + $array2 != $array2 + $array1

$array1 = array(
'11' => 'x1',
'22' => 'x1' 
);  

$array2 = array(
'22' => 'x2',
'33' => 'x2' 
);

con $ array1 + $ array2

$array1 + $array2 = array(
'11' => 'x1',
'22' => 'x1',
'33' => 'x2'
);

e con $ array2 + $ array1

$array2 + $array1 = array(  
'11' => 'x1',  
'22' => 'x2',  
'33' => 'x2'  
);

25

Funziona:

$output = $array1 + $array2;

12
Non lo consiglierei perché il suo comportamento è molto poco intuitivo, ad esempio[1,2,3] + [4,5,6] == [1,2,3]
jchook

@jchook Cosa mi consigliate allora?
Michas

Questo è ciò di cui avevo bisogno, grazie. Ecco perché: http_build_query(array_merge($array1, $array2))non ha funzionato per me, mentre http_build_query($array1 + $array2)ha funzionato.
BarryMode

4

Per fare ciò, puoi scorrere uno e aggiungere all'altro:

<?php

$test1 = array( 
'11' => '11',
'22' => '22',
'33' => '33',
'44' => '44'
);

$test2 = array( 
'44' => '44',
'55' => '55',
'66' => '66',
'77' => '77'
);


function combineWithKeys($array1, $array2)
{
    foreach($array1 as $key=>$value) $array2[$key] = $value;
    asort($array2);
    return $array2;
} 

print_r(combineWithKeys($test1, $test2));

?>

AGGIORNAMENTO: KingCrunch ha trovato la soluzione migliore :print_r($array1+$array2);


2

Se utilizzi PHP 7.4 o versioni successive, puoi utilizzare l'operatore di diffusione ...come i seguenti esempi da Documenti PHP:

$arr1 = [1, 2, 3];
$arr2 = [...$arr1]; //[1, 2, 3]
$arr3 = [0, ...$arr1]; //[0, 1, 2, 3]
$arr4 = array(...$arr1, ...$arr2, 111); //[1, 2, 3, 1, 2, 3, 111]
$arr5 = [...$arr1, ...$arr1]; //[1, 2, 3, 1, 2, 3]

function getArr() {
  return ['a', 'b'];
}
$arr6 = [...getArr(), 'c']; //['a', 'b', 'c']

$arr7 = [...new ArrayIterator(['a', 'b', 'c'])]; //['a', 'b', 'c']

function arrGen() {
    for($i = 11; $i < 15; $i++) {
        yield $i;
    }
}
$arr8 = [...arrGen()]; //[11, 12, 13, 14]

Funziona come in JavaScript ES6.

Vedi di più su https://wiki.php.net/rfc/spread_operator_for_array .


Questo non è applicabile alla domanda. L'OP ha chiavi stringa per l'array (che non funziona con l'operatore spread) e l'OP vuole preservare le chiavi (l'operatore spread butta via le chiavi). Inoltre l'OP non vuole duplicati.
martti

Oh, vedo i tuoi punti. È vero e hai ragione. Potete fornire del codice per aiutarci a migliorare la mia risposta per altre persone? Apprezzerei il tuo tempo! Grazie mille per aver sottolineato gli svantaggi della mia risposta.
Studente di scienze il

Non credo che l'operatore di diffusione sia la strada da percorrere qui. Usa invece la risposta data$array1 + $array2
martti

Non ne ero consapevole! Voglio dire, non sapevo che possiamo farlo $ouput = $array1 + $array2. Ora ho imparato qualcosa di nuovo! Grazie!
Student of Science

1

Funziona:

$a = array(1 => 1, 2 => 2, 3 => 3);
$b = array(4 => 4, 5 => 5, 6 => 6);
$c = $a + $b;
print_r($c);

1

Avvertimento! $ array1 + $ array2 sovrascrive le chiavi, quindi la mia soluzione (per array multidimensionali) è usare array_unique ()

array_unique(array_merge($a, $b), SORT_REGULAR);

Avviso:

5.2.10+ Modificato il valore predefinito di sort_flagsback in SORT_STRING.

5.2.9 L' impostazione predefinita è SORT_REGULAR.

5.2.8- L' impostazione predefinita è SORT_STRING

Funziona perfettamente . Spero che aiuti lo stesso.


1
array_merge()non conserva le chiavi però. L'array creato da questo è 0 indicizzato.
HPierce

@HPierce bene, in caso di aggiunta di array multidimensionali, alcune informazioni andranno perse usando +. Dai un'occhiata a: PHPFiddle , $ b [0] andrà perso ...
Norman Edance

1

Il nuovo modo di farlo con php7.4 è l'operatore Spread [...]

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
var_dump($fruits);

L'operatore di diffusione dovrebbe avere prestazioni migliori rispetto a array_merge

Un vantaggio significativo dell'operatore Spread è che supporta tutti gli oggetti attraversabili, mentre la funzione array_merge supporta solo gli array.


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.