PHP łączy dwie tablice asocjacyjne w jedną tablicę

85
$array1 = array("$name1" => "$id1");

$array2 = array("$name2" => "$id2", "$name3" => "$id3");

Potrzebuję nowej tablicy łączącej wszystko razem, tj. Byłoby

$array3 = array("$name1" => "$id1", "$name2" => "$id2", "$name3" => "$id3");

Jaki jest najlepszy sposób, aby to zrobić?

Przepraszam, zapomniałem, identyfikatory nigdy się nie zgadzają, ale z technicznego punktu widzenia nazwy mogłyby, ale nie byłoby prawdopodobne, i wszystkie muszą być wymienione w jednej tablicy. Spojrzałem na array_merge, ale nie byłem pewien, czy to najlepszy sposób na zrobienie tego. Jak byś to przetestował jednostkowo?

jsteinmann
źródło
5
Wygląda na to, że prawdopodobnie szukasz po prostu array_merge.
Corbin
Myślę, że najlepszym sposobem, jeśli wiesz, że klawisze są różne, jest użycie operatora + =: $ tablica1 + = $ tablica2; To dodaje wszystkie elementy $ array2 na koniec $ array1.
David Spector

Odpowiedzi:

127

array_merge() jest bardziej wydajny, ale istnieje kilka opcji:

$array1 = array("id1" => "value1");

$array2 = array("id2" => "value2", "id3" => "value3", "id4" => "value4");

$array3 = array_merge($array1, $array2/*, $arrayN, $arrayN*/);
$array4 = $array1 + $array2;

echo '<pre>';
var_dump($array3);
var_dump($array4);
echo '</pre>';


// Results:
    array(4) {
      ["id1"]=>
      string(6) "value1"
      ["id2"]=>
      string(6) "value2"
      ["id3"]=>
      string(6) "value3"
      ["id4"]=>
      string(6) "value4"
    }
    array(4) {
      ["id1"]=>
      string(6) "value1"
      ["id2"]=>
      string(6) "value2"
      ["id3"]=>
      string(6) "value3"
      ["id4"]=>
      string(6) "value4"
    }
Samuel Cook
źródło
7
Jaka jest zaleta funkcji array_merge w porównaniu z operatorem?
jsteinmann
37
Array Union (+): Operator + dodaje elementy pozostałych kluczy z tablicy praworęcznej do tablicy leworęcznej, podczas gdy klucze zduplikowane NIE są nadpisywane. array_merge (): Jeśli tablice wejściowe mają te same klucze łańcuchowe, późniejsza wartość tego klucza nadpisze poprzednią. Jeśli jednak tablice zawierają klucze numeryczne, późniejsza wartość nie nadpisze oryginalnej wartości, ale zostanie dodana. Jeśli wszystkie tablice zawierają tylko klucze numeryczne, otrzymana tablica otrzymuje klucze zwiększające się, zaczynając od zera.
Samuel Cook
12
Należy również zauważyć, że array_mergezwróci NULL, jeśli którykolwiek z argumentów ma wartość NULL.
SeanWM
4
Jeśli istnieją klucze całkowite, zostaną one zamienione na klucze całkowite ZACZYNAJĄC SIĘ od 0. Bądź bardzo ostrożny z array_merge. Lepiej użyj pętli foreach, aby zrobić to, co próbujesz zrobić.
user2850305
24

Sprawdź array_merge().

$array3 = array_merge($array1, $array2);
Ćwiek
źródło
22
@SudhanshuSaxena Biorąc pod uwagę, że byłem pierwszą osobą, która to opublikowała, nie widzę, jak mogłaby to być ponowna odpowiedź.
Brad
10

Istnieje również array_replacesytuacja, w której oryginalna tablica jest modyfikowana przez inne tablice z zachowaniem skojarzenia klucz => wartość bez tworzenia zduplikowanych kluczy.

  • Te same klucze w innych tablicach spowodują, że wartości zastąpią oryginalną tablicę
  • Nowe klucze w innych tablicach zostaną utworzone w oryginalnej tablicy
wranvaud
źródło
1
To jest poprawna odpowiedź. array_merge nie zadziała, jeśli masz klucze numeryczne (wszystkie klucze zostaną przekonwertowane na spójne indeksy).
Dmitry
3

Używam otoki wokół array_merge, aby poradzić sobie z komentarzem SeanWM dotyczącym tablic zerowych; Czasami chcę też pozbyć się duplikatów. Generalnie chcę również scalić jedną tablicę w drugą, w przeciwieństwie do tworzenia nowej tablicy. To kończy się jako:

/**
 * Merge two arrays - but if one is blank or not an array, return the other.
 * @param $a array First array, into which the second array will be merged
 * @param $b array Second array, with the data to be merged
 * @param $unique boolean If true, remove duplicate values before returning
 */
function arrayMerge(&$a, $b, $unique = false) {
    if (empty($b)) {
        return;  // No changes to be made to $a
    }
    if (empty($a)) {
        $a = $b;
        return;
    }
    $a = array_merge($a, $b);
    if ($unique) {
        $a = array_unique($a);
    }
}
xgretsch
źródło
2
        $array = array(
            22 => true,
            25 => true,
            34 => true,
            35 => true,
        );

        print_r(
            array_replace($array, [
                22 => true,
                42 => true,
            ])
        );

        print_r(
            array_merge($array, [
                22 => true,
                42 => true,
            ])
        );

Jeśli jest to tablica asocjacyjna numeryczna, ale nie sekwencyjna, należy użyć array_replace

tom10271
źródło
0

Natknąłem się na to pytanie, próbując zidentyfikować czysty sposób połączenia dwóch tablic asocjacyjnych.

Próbowałem dołączyć do dwóch różnych stołów, które nie były ze sobą powiązane.

Oto, co wymyśliłem dla zapytania PDO łączącego dwie tabele. To Samuel Cook array_merge()znalazł dla mnie rozwiązanie dzięki +1 dla niego.

        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = "SELECT * FROM ".databaseTbl_Residential_Prospects."";
        $ResidentialData = $pdo->prepare($sql);
        $ResidentialData->execute(array($lapi));
        $ResidentialProspects = $ResidentialData->fetchAll(PDO::FETCH_ASSOC);

        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = "SELECT * FROM ".databaseTbl_Commercial_Prospects."";
        $CommercialData = $pdo->prepare($sql);
        $CommercialData->execute(array($lapi));
        $CommercialProspects = $CommercialData->fetchAll(PDO::FETCH_ASSOC);

        $Prospects = array_merge($ResidentialProspects,$CommercialProspects);
        echo '<pre>';
        var_dump($Prospects);
        echo '</pre>';

Może to pomoże komuś innemu.

lzoesch
źródło
0

AKTUALIZACJA Krótka uwaga, jak widzę, wygląda to naprawdę głupio i nie ma dobrego zastosowania w czystym PHP, ponieważ po array_mergeprostu tam działa. ALE wypróbuj to ze sterownikiem PHP MongoDB, zanim spieszysz się z głosowaniem przeciw. Ten koleś BĘDZIE dodawał indeksy z jakiegokolwiek powodu i zrujnuje scalony obiekt. Dzięki mojej naiwnej małej funkcji scalenie przebiega dokładnie tak, jak powinno być z tradycyjnym array_merge.


Wiem, że to stare pytanie, ale chciałbym dodać jeszcze jedną sprawę miałem niedawno z zapytaniami kierowców MongoDB i żaden array_merge, array_replaceani array_pushdziałało. Miałem nieco złożoną strukturę obiektów opakowanych jako tablice w tablicy:

$a = [
 ["a" => [1, "a2"]],
 ["b" => ["b1", 2]]
];
$t = [
 ["c" => ["c1", "c2"]],
 ["b" => ["b1", 2]]
];

Musiałem je scalić, zachowując taką samą strukturę, jak ta:

$merged = [
 ["a" => [1, "a2"]],
 ["b" => ["b1", 2]],
 ["c" => ["c1", "c2"]],
 ["b" => ["b1", 2]]
];

Najlepsze rozwiązanie jakie wymyśliłem to:

public static function glueArrays($arr1, $arr2) {
    // merges TWO (2) arrays without adding indexing. 
    $myArr = $arr1;
    foreach ($arr2 as $arrayItem) {
        $myArr[] = $arrayItem;
    }
    return $myArr;
}
JohnPan
źródło