PHP: Zwei Arrays zusammenführen und dabei die Schlüssel behalten, anstatt sie neu zu indizieren?


255

Wie kann ich zwei Arrays zusammenführen (eines mit Zeichenfolge => Wertepaaren und eines mit int => Wertepaaren), während die Zeichenfolgen / int-Schlüssel beibehalten werden? Keiner von ihnen wird sich jemals überlappen (weil einer nur Zeichenfolgen und der andere nur Ganzzahlen hat).

Hier ist mein aktueller Code (der nicht funktioniert, da array_merge das Array mit Ganzzahlschlüsseln neu indiziert):

// 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
Das ist seltsam: Laut der PHP-Dokumentseite sollte array_merge das nicht tun. Sind die Zeichenfolgenschlüssel tatsächlich Zeichenfolgendarstellungen von Ganzzahlen?
Owenmarshall

array_merge indiziert mein zweites Array neu. dh. es ändert das Array von array( 123 => "VALUE123" )zuarray( 0 => "VALUE123" )
Garrett

hmm das ist interessant Ich nehme an, dass die PHP-Dokumentation in diesem Punkt etwas unklar sein könnte. Es wird angegeben, was passieren wird, wenn alle Arrays Zifferntasten haben, aber es wird nicht speziell angegeben, was passieren wird, wenn dies nicht der Fall ist.
Steven Oxley

vielleicht nicht vor 2 Jahren. Aber im Jahr 2012 ist die Dokumentation in diesem Punkt kristallklar.
Cartbeforehorse

Eigentlich ist die Dokumentation noch nicht kristallklar. "Numerisch" enthält tatsächlich eine Zeichenfolge mit allen Ziffern (PHP 5.3.3). assert(array(0=>0,1=>1) === array_merge(array('9'=>0), array('9'=>1)))
Bob Stein

Antworten:


557

Sie können die Arrays einfach 'hinzufügen':

>> $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
Seien Sie sehr vorsichtig damit! Der Operator + ist keine Ergänzung, sondern eine Vereinigung. Wenn sich die Tasten nicht überlappen, ist alles in
Ordnung

3
Wow - Sie haben mir fast drei Jahre später Eimer mit Codezeilen erspart.
Stephen O'Flynn

86
Falls sich jemand fragt: Was ist, wenn sie sich überschneiden? : php.net: "Der Operator + gibt das an das linke Array angehängte rechte Array zurück. Für Schlüssel, die in beiden Arrays vorhanden sind, werden die Elemente aus dem linken Array und die übereinstimmenden Elemente von rechts verwendet -hand Array wird ignoriert. "
Flion

2
@Flion es ist komplizierter als das. Mit '+' habe ich gerade zwei Unterarrays mit einem Element mit einem gemeinsamen Schlüssel und Unterschlüssel hinzugefügt: Die Werte wurden hinzugefügt! 100000 => Array (Größe = 3) 1 => int 128 2 => int 56 3 => int 7 + 100000 => Array (Größe = 1) 2 => int 30 Ergebnis: 100000 => Array (Größe = 3) 1 => int 128 2 => int 86 3 => int 7 Grundsätzlich hat das Hinzufügen von [2 => 56] + [2 => 30] den Wert nicht ersetzt, sondern hinzugefügt und wurde zu [2 => 86]
Dario Fumagalli

1
@DarioFumagalli Ich weiß nicht , ob ich Mißverständnis oder wenn es nur seit 2016 geändert, aber zu diesem Zeitpunkt der print_r([2 => 56] + [2 => 30]);Betriebserträge Array ( [2] => 56 ). Die linke Seite bleibt also wie angegeben. Dies ist ab PHP 7.1.19, das auf repl.it ausgeführt wird .
Charles Wood

62

In Anbetracht dessen, dass Sie haben

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

Dabei wird Folgendes $merge = $replacement + $replaced;ausgegeben:

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

Das erste Array aus sum hat Werte in der endgültigen Ausgabe.

Dabei wird Folgendes $merge = $replaced + $replacement;ausgegeben:

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

[[thumbsup]] auf diesem
Jhourlad Estrella

21
Zusammenfassend lässt sich sagen, dass beim Hinzufügen von 2 Arrays die Werte der ersten Werte die Werte der zweiten überschreiben.
Dziamid

1
Ich dachte, der zweite wird den ersten überschreiben. :)
Asim KT

1
Genau. Deshalb konnte ich nicht verwenden $allValues += $newValues;.
MarthyM

Tun $merge = $replacement + $replaced;wird ausgegeben:Array ( [4] => value2 [6] => value3 [1] => value1 )
Chandan Sharma

24

Obwohl diese Frage ziemlich alt ist, möchte ich nur eine weitere Möglichkeit hinzufügen, eine Zusammenführung unter Beibehaltung der Schlüssel durchzuführen.

Neben dem Hinzufügen von Schlüsseln / Werten zu vorhandenen Arrays mithilfe des +Zeichens können Sie eine array_replace.

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

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

Das Ergebnis wird sein:

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

Dieselben Schlüssel werden vom letzteren Array überschrieben.
Es gibt auch eine array_replace_recursive, die dies auch für Subarrays tut.

Live-Beispiel auf 3v4l.org


3

Zwei Arrays können einfach hinzugefügt oder vereinigt werden, ohne dass die ursprüngliche Indizierung durch den Operator + geändert wird . Dies ist sehr hilfreich bei der Auswahl von Dropdown-Listen für Laravel und Codeigniter.

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

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

  $arr_option = $empty_option + $option_list;

Ausgabe wird sein:

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

1

Probieren Sie die Funktionen array_replace_recursive oder array_replace aus

$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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.