PHP: Zusammenführen von zwei Arrays unter Beibehaltung der Schlüssel statt Neuindizierung?

Lesezeit: 8 Minuten

PHP Zusammenfuhren von zwei Arrays unter Beibehaltung der Schlussel statt
Garrett

Wie kann ich zwei Arrays zusammenführen (eines mit String => Wertpaaren und eines mit Int => Wertpaaren), während ich die String/Int-Schlüssel behalte? Keiner von ihnen wird sich jemals überlappen (weil der eine nur Zeichenfolgen und der andere nur ganze Zahlen hat).

Hier ist mein aktueller Code (der nicht funktioniert, weil array_merge das Array mit ganzzahligen Schlü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);

  • Das ist seltsam: laut der PHP-Dokumentationsseite ist array_merge sollte nicht TU das. Sind die Zeichenfolgenschlüssel tatsächlich Zeichenfolgendarstellungen von ganzen Zahlen?

    – owmarschall

    20. Juli 2010 um 16:16 Uhr

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

    – Garrett

    20. Juli 2010 um 16:16 Uhr

  • hm, das ist interessant. Ich nehme an, dass die PHP-Dokumentation in diesem Punkt etwas unklar sein könnte. Es sagt, was passiert, wenn alle der Arrays haben numerische Tasten, aber es wird nicht ausdrücklich gesagt, was passiert, wenn sie dies nicht tun.

    – Steven Oxley

    20. Juli 2010 um 16:25 Uhr

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

    – Wagen vor dem Pferd

    15. Mai 2012 um 8:32 Uhr

  • Tatsächlich, die Dokumentation ist noch nicht glasklar. “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

    11. Februar 2013 um 3:27 Uhr

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

  • Seien Sie dabei SEHR vorsichtig! Der Operator + ist keine Addition, sondern eine Vereinigung. Wenn sich die Tasten nicht überlappen, ist alles gut, aber wenn doch …

    – GordonM

    3. Mai 2012 um 15:46 Uhr

  • Einfach wow – Sie haben mir fast drei Jahre später haufenweise Codezeilen erspart.

    – Stephen O’Flynn

    8. Februar 2013 um 18:13 Uhr

  • Falls sich jemand fragt: “Was ist, wenn sie sich überschneiden?” : php.net: “Der +-Operator gibt das rechte Array an das linke Array angehängt zurück; für Schlüssel, die in beiden Arrays vorhanden sind, werden die Elemente aus dem linken Array verwendet und die passenden Elemente aus dem rechten -hand-Array wird ignoriert.”

    – Floon

    18. September 2013 um 16:24 Uhr

  • @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 addieren [2 => 56] + [2 => 30] ersetzte den Wert nicht, sondern fügte ihn hinzu und wurde [2 => 86]

    – Dario Fumagalli

    30. November 2016 um 1:20 Uhr

  • @DarioFumagalli Ich weiß nicht, ob ich falsch verstehe oder ob es sich nur seit 2016 geändert hat, aber zu diesem Zeitpunkt die Operation print_r([2 => 56] + [2 => 30]); Erträge Array ( [2] => 56 ). Also bleibt die linke Seite wie angegeben. Dies ist ab PHP 7.1.19 und läuft weiter ersetzen.

    – Karl Holz

    27. Juni 2019 um 20:34 Uhr

PHP Zusammenfuhren von zwei Arrays unter Beibehaltung der Schlussel statt
CRK

Wenn man bedenkt, dass Sie haben

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

Tun $merge = $replacement + $replaced; wird ausgeben:

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

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

Tun $merge = $replaced + $replacement; wird ausgeben:

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

  • [[thumbsup]]auf diesem

    – Jhourlad Estrella

    19. Juli 2013 um 8:38 Uhr

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

    – Dziamid

    31. Oktober 2013 um 14:10 Uhr

  • Ich dachte, der zweite überschreibt den ersten. 🙂

    – Asim KT

    9. Oktober 2017 um 6:24 Uhr

  • Exakt. Deshalb konnte ich nicht verwenden $allValues += $newValues;.

    – MarthyM

    10. Oktober 2017 um 13:01 Uhr

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

    – Chandan Sharma

    19. Oktober 2019 um 5:39 Uhr


1646175247 955 PHP Zusammenfuhren von zwei Arrays unter Beibehaltung der Schlussel statt
Danopz

Ich möchte nur eine weitere Möglichkeit hinzufügen, eine Zusammenführung durchzuführen, während die Schlüssel beibehalten werden.

Neben dem Hinzufügen von Schlüsseln/Werten zu bestehenden Arrays mit dem + Zeichen, dass Sie ein tun könnten array_replace.

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

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

Das Ergebnis wird sein:

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

Gleiche Schlüssel werden durch das letztere Array überschrieben.
Es gibt auch eine array_replace_recursivedie dies auch für Subarrays tun.

Live-Beispiel auf 3v4l.org

1646175248 688 PHP Zusammenfuhren von zwei Arrays unter Beibehaltung der Schlussel statt
amba patel

Zwei Arrays können einfach hinzugefügt oder vereinigt werden, ohne ihre ursprüngliche Indizierung zu ändern + Operator. Dies wird im Drop-down-Menü zur Auswahl von Laravel und Codeigniter sehr hilfreich sein.

 $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',
 );

1646175249 82 PHP Zusammenfuhren von zwei Arrays unter Beibehaltung der Schlussel statt
Ve

Die Anforderung des OP ist es, Schlüssel zu bewahren (Keep Keys) und sich nicht zu überlappen (glaube ich überschreiben). In einigen Fällen, z. B. bei numerischen Tasten, ist dies möglich, bei Zeichenfolgentasten scheint dies jedoch nicht möglich zu sein.

Wenn du benutzt array_merge() Die numerischen Tasten werden immer neu indiziert oder neu nummeriert.

Wenn du benutzt array_replace(), array_replace_recursive() es wird von rechts nach links überlappt oder überschrieben. Der Wert mit demselben Schlüssel im ersten Array wird durch das zweite Array ersetzt.

Wenn du benutzt $array1 + $array2 Wie der Kommentar erwähnt wurde, wenn die Schlüssel gleich sind, wird der Wert aus dem ersten Array beibehalten, aber das zweite Array gelöscht.

Benutzerdefinierte Funktion.

Hier ist meine Funktion, die ich gerade geschrieben habe, um an denselben Anforderungen zu arbeiten. Sie können es für jeden Zweck verwenden.

/**
 * Array custom merge. Preserve indexed array key (numbers) but overwrite string key (same as PHP's `array_merge()` function).
 * 
 * If the another array key is string, it will be overwrite the first array.<br>
 * If the another array key is integer, it will be add to first array depend on duplicated key or not. 
 * If it is not duplicate key with the first, the key will be preserve and add to the first array.
 * If it is duplicated then it will be re-index the number append to the first array.
 *
 * @param array $array1 The first array is main array.
 * @param array ...$arrays The another arrays to merge with the first.
 * @return array Return merged array.
 */
function arrayCustomMerge(array $array1, array ...$arrays): array
{
    foreach ($arrays as $additionalArray) {
        foreach ($additionalArray as $key => $item) {
            if (is_string($key)) {
                // if associative array.
                // item on the right will always overwrite on the left.
                $array1[$key] = $item;
            } elseif (is_int($key) && !array_key_exists($key, $array1)) {
                // if key is number. this should be indexed array.
                // and if array 1 is not already has this key.
                // add this array with the key preserved to array 1.
                $array1[$key] = $item;
            } else {
                // if anything else...
                // get all keys from array 1 (numbers only).
                $array1Keys = array_filter(array_keys($array1), 'is_int');
                // next key index = get max array key number + 1.
                $nextKeyIndex = (intval(max($array1Keys)) + 1);
                unset($array1Keys);
                // set array with the next key index.
                $array1[$nextKeyIndex] = $item;
                unset($nextKeyIndex);
            }
        }// endforeach; $additionalArray
        unset($item, $key);
    }// endforeach;
    unset($additionalArray);

    return $array1;
}// arrayCustomMerge

Testen.

<?php
$array1 = [
    'cat', 
    'bear', 
    'fruitred' => 'apple',
    3 => 'dog',
    null => 'null',
];
$array2 = [
    1 => 'polar bear',
    20 => 'monkey',
    'fruitred' => 'strawberry',
    'fruityellow' => 'banana',
    null => 'another null',
];

// require `arrayCustomMerge()` function here.

function printDebug($message)
{
    echo '<pre>';
    print_r($message);
    echo '</pre>' . PHP_EOL;
}

echo 'array1: <br>';
printDebug($array1);
echo 'array2: <br>';
printDebug($array2);


echo PHP_EOL . '<hr>' . PHP_EOL . PHP_EOL;


echo 'arrayCustomMerge:<br>';
$merged = arrayCustomMerge($array1, $array2);
printDebug($merged);


assert($merged[0] == 'cat', 'array key 0 should be \'cat\'');
assert($merged[1] == 'bear', 'array key 1 should be \'bear\'');
assert($merged['fruitred'] == 'strawberry', 'array key \'fruitred\' should be \'strawberry\'');
assert($merged[3] == 'dog', 'array key 3 should be \'dog\'');
assert(array_search('another null', $merged) !== false, '\'another null\' should be merged.');
assert(array_search('polar bear', $merged) !== false, '\'polar bear\' should be merged.');
assert($merged[20] == 'monkey', 'array key 20 should be \'monkey\'');
assert($merged['fruityellow'] == 'banana', 'array key \'fruityellow\' should be \'banana\'');

Die Ergebnisse.

array1:

Array
(
    [0] => cat
    [1] => bear
    [fruitred] => apple
    [3] => dog
    [] => null
)

array2:

Array
(
    [1] => polar bear
    [20] => monkey
    [fruitred] => strawberry
    [fruityellow] => banana
    [] => another null
)

---
arrayCustomMerge:

Array
(
    [0] => cat
    [1] => bear
    [fruitred] => strawberry
    [3] => dog
    [] => another null
    [4] => polar bear
    [20] => monkey
    [fruityellow] => banana
)

  • Liebte das, du hast mir viel Zeit gespart..

    – Çh Furqan Hämëèd Jūtt

    19. Februar um 20:14 Uhr

Versuchen Sie die Funktionen array_replace_recursive oder 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

  • Liebte das, du hast mir viel Zeit gespart..

    – Çh Furqan Hämëèd Jūtt

    19. Februar um 20:14 Uhr

905720cookie-checkPHP: Zusammenführen von zwei Arrays unter Beibehaltung der Schlüssel statt Neuindizierung?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy