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?


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"
    }

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

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

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);
    }
}

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


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.


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;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.