$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?
php
arrays
multidimensional-array
associative-array
jsteinmann
źródło
źródło
Odpowiedzi:
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" }
źródło
array_merge
zwróci NULL, jeśli którykolwiek z argumentów ma wartość NULL.Sprawdź
array_merge()
.źródło
Istnieje również
array_replace
sytuacja, w której oryginalna tablica jest modyfikowana przez inne tablice z zachowaniem skojarzenia klucz => wartość bez tworzenia zduplikowanych kluczy.źródło
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); } }
źródło
$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
źródło
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.
źródło
AKTUALIZACJA Krótka uwaga, jak widzę, wygląda to naprawdę głupio i nie ma dobrego zastosowania w czystym PHP, ponieważ po
array_merge
prostu 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 tradycyjnymarray_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_replace
aniarray_push
dział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; }
źródło