PHP: unire due matrici mantenendo le chiavi invece di reindicizzare?


255

Come posso unire due array (uno con string => coppie di valori e un altro con int => coppie di valori) mantenendo le chiavi string / int? Nessuno di loro si sovrapporrà mai (perché uno ha solo stringhe e l'altro ha solo numeri interi).

Ecco il mio codice attuale (che non funziona, perché array_merge sta reindicizzando l'array con chiavi intere):

// get all id vars by combining the static and dynamic
$staticIdentifications = array(
 Users::userID => "USERID",
 Users::username => "USERNAME"
);
// get the dynamic vars, formatted: varID => varName
$companyVarIdentifications = CompanyVars::getIdentificationVarsFriendly($_SESSION['companyID']);
// merge the static and dynamic vars (*** BUT KEEP THE INT INDICES ***)
$idVars = array_merge($staticIdentifications, $companyVarIdentifications);

1
È strano: secondo la pagina del documento PHP, array_merge non dovrebbe farlo. Le chiavi di stringa sono in realtà rappresentazioni di stringa di numeri interi?
owenmarshall,

array_merge sta reindicizzando il mio secondo array. vale a dire. sta cambiando l'array da array( 123 => "VALUE123" )aarray( 0 => "VALUE123" )
Garrett il

hmm, questo è interessante. Suppongo che la documentazione di PHP potrebbe essere poco chiara su questo punto. Dice cosa accadrà se tutte le matrici hanno tasti numerici, ma non specifica cosa accadrà se non lo fanno.
Steven Oxley,

forse non 2 anni fa. Ma nel 2012, la documentazione è cristallina su questo punto.
cartbeforehorse,

In realtà, la documentazione non è ancora cristallina. "Numerico" in realtà include una stringa con tutte le cifre (PHP 5.3.3). assert(array(0=>0,1=>1) === array_merge(array('9'=>0), array('9'=>1)))
Bob Stein,

Risposte:


557

Puoi semplicemente "aggiungere" gli array:

>> $a = array(1, 2, 3);
array (
  0 => 1,
  1 => 2,
  2 => 3,
)
>> $b = array("a" => 1, "b" => 2, "c" => 3)
array (
  'a' => 1,
  'b' => 2,
  'c' => 3,
)
>> $a + $b
array (
  0 => 1,
  1 => 2,
  2 => 3,
  'a' => 1,
  'b' => 2,
  'c' => 3,
)

44
Stai molto attento con questo! L'operatore + non è un'aggiunta, è un'unione. Se le chiavi non si sovrappongono, allora va tutto bene, ma se lo fanno ...
GordonM,

3
Caspita: mi hai salvato un sacco di righe di codice, quasi tre anni dopo.
Stephen O'Flynn,

86
Nel caso qualcuno si chieda "cosa succede se si sovrappongono?" : php.net: "L'operatore + restituisce l'array di destra aggiunto all'array di sinistra; per le chiavi che esistono in entrambi gli array, verranno utilizzati gli elementi dell'array di sinistra e gli elementi corrispondenti da destra l'array manuale verrà ignorato. "
Flion,

2
@Flion è più complicato di così. Usando '+', ho appena aggiunto due sotto-array con un elemento con una chiave e una sottochiave comuni: i valori sono stati aggiunti! 100000 => array (size = 3) 1 => int 128 2 => int 56 3 => int 7 + 100000 => array (size = 1) 2 => int 30 Risultato: 100000 => array (size = 3) 1 => int 128 2 => int 86 3 => int 7 In sostanza l'aggiunta di [2 => 56] + [2 => 30] non ha sostituito il valore ma l'ha aggiunto ed è diventata [2 => 86]
Dario Fumagalli

1
@DarioFumagalli Non so se sto fraintendendo o se è appena cambiato dal 2016, ma a questo punto l'operazione print_r([2 => 56] + [2 => 30]);cede Array ( [2] => 56 ). Quindi, mantiene il lato sinistro come specificato. Questo è quanto di PHP 7.1.19, in esecuzione su repl.it .
Charles Wood,

62

Considerando che hai

$replaced = array('1' => 'value1', '4' => 'value4');
$replacement = array('4' => 'value2', '6' => 'value3');

Fare $merge = $replacement + $replaced;uscirà:

Array('4' => 'value2', '6' => 'value3', '1' => 'value1');

Il primo array dalla somma avrà valori nell'output finale.

Fare $merge = $replaced + $replacement;uscirà:

Array('1' => 'value1', '4' => 'value4', '6' => 'value3');

[[thumbsup]] su questo
Jhourlad Estrella,

21
Per riassumere, quando si aggiungono 2 matrici, i valori del primo sostituiscono i valori del secondo.
Dziamid,

1
Pensavo che il secondo avesse la precedenza sul primo. :)
Asim KT

1
Esattamente. Ecco perché non ho potuto usare $allValues += $newValues;.
MarthyM,

Il $merge = $replacement + $replaced;risultato sarà:Array ( [4] => value2 [6] => value3 [1] => value1 )
Chandan Sharma,

24

Mentre questa domanda è piuttosto vecchia, voglio solo aggiungere un'altra possibilità di fare una fusione mantenendo le chiavi.

Oltre ad aggiungere chiave / valori ad array esistenti usando il +segno che potresti fare array_replace.

$a = array('foo' => 'bar', 'some' => 'string');
$b = array(42 => 'answer to the life and everything', 1337 => 'leet');

$merged = array_replace($a, $b);

Il risultato sarà:

Array
(
  [foo] => bar
  [some] => string
  [42] => answer to the life and everything
  [1337] => leet
)

Le stesse chiavi verranno sovrascritte da quest'ultimo array.
C'è anche un array_replace_recursive, che lo fa anche per i subarrays.

Esempio live su 3v4l.org


3

Due array possono essere facilmente aggiunti o uniti senza modificare l'indicizzazione originale di + operator. Questo sarà di grande aiuto nel menu a discesa di laravel e codeigniter.

 $empty_option = array(
         ''=>'Select Option'
          );

 $option_list = array(
          1=>'Red',
          2=>'White',
          3=>'Green',
         );

  $arr_option = $empty_option + $option_list;

L'output sarà:

$arr_option = array(
   ''=>'Select Option'
   1=>'Red',
   2=>'White',
   3=>'Green',
 );

1

Prova le funzioni array_replace_recursive o array_replace

$a = array('userID' => 1, 'username'=> 2);
array (
  userID => 1,
  username => 2
)
$b = array('userID' => 1, 'companyID' => 3);
array (
  'userID' => 1,
  'companyID' => 3
)
$c = array_replace_recursive($a,$b);
array (
  userID => 1,
  username => 2,
  companyID => 3
)

http://php.net/manual/en/function.array-replace-recursive.php

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.