Mam dwie takie tablice:
array(
'11' => '11',
'22' => '22',
'33' => '33',
'44' => '44'
);
array(
'44' => '44',
'55' => '55',
'66' => '66',
'77' => '77'
);
Chcę połączyć te dwie tablice tak, aby nie zawierały zduplikowanych, a także zachować ich oryginalne klucze. Na przykład wynik powinien wyglądać następująco:
array(
'11' => '11',
'22' => '22',
'33' => '33',
'44' => '44',
'55' => '55',
'66' => '66',
'77' => '77'
);
Próbowałem tego, ale zmienia się ich oryginalne klucze:
$output = array_unique( array_merge( $array1 , $array2 ) );
Jakieś rozwiązanie?
$array1 + $array2
jest krótkie i wydajne rozwiązanie zamiastarray_merge() - array_combine()
kombinacji$a + $b != array_merge($a, $b)
Powinieneś to wziąć pod uwagę
$array1 + $array2 != $array2 + $array1
$array1 = array( '11' => 'x1', '22' => 'x1' ); $array2 = array( '22' => 'x2', '33' => 'x2' );
z $ tablica1 + $ tablica2
$array1 + $array2 = array( '11' => 'x1', '22' => 'x1', '33' => 'x2' );
i $ tablica2 + $ tablica1
$array2 + $array1 = array( '11' => 'x1', '22' => 'x2', '33' => 'x2' );
źródło
To działa:
źródło
[1,2,3] + [4,5,6] == [1,2,3]
http_build_query(array_merge($array1, $array2))
nie działa dla mnie,http_build_query($array1 + $array2)
ale tak.Aby to zrobić, możesz zapętlić jeden i dołączyć do drugiego:
<?php $test1 = array( '11' => '11', '22' => '22', '33' => '33', '44' => '44' ); $test2 = array( '44' => '44', '55' => '55', '66' => '66', '77' => '77' ); function combineWithKeys($array1, $array2) { foreach($array1 as $key=>$value) $array2[$key] = $value; asort($array2); return $array2; } print_r(combineWithKeys($test1, $test2)); ?>
AKTUALIZACJA: KingCrunch wymyślił najlepsze rozwiązanie :
print_r($array1+$array2);
źródło
Jeśli używasz PHP 7.4 lub nowszego, możesz użyć operatora spreadu
...
jako poniższych przykładów z Dokumentów PHP:$arr1 = [1, 2, 3]; $arr2 = [...$arr1]; //[1, 2, 3] $arr3 = [0, ...$arr1]; //[0, 1, 2, 3] $arr4 = array(...$arr1, ...$arr2, 111); //[1, 2, 3, 1, 2, 3, 111] $arr5 = [...$arr1, ...$arr1]; //[1, 2, 3, 1, 2, 3] function getArr() { return ['a', 'b']; } $arr6 = [...getArr(), 'c']; //['a', 'b', 'c'] $arr7 = [...new ArrayIterator(['a', 'b', 'c'])]; //['a', 'b', 'c'] function arrGen() { for($i = 11; $i < 15; $i++) { yield $i; } } $arr8 = [...arrGen()]; //[11, 12, 13, 14]
Działa jak w JavaScript ES6.
Zobacz więcej na https://wiki.php.net/rfc/spread_operator_for_array .
źródło
$array1 + $array2
$ouput = $array1 + $array2
. Teraz nauczyłem się czegoś nowego! Dziękuję Ci!To działa:
$a = array(1 => 1, 2 => 2, 3 => 3); $b = array(4 => 4, 5 => 5, 6 => 6); $c = $a + $b; print_r($c);
źródło
Ostrzeżenie! $ array1 + $ array2 nadpisuje klucze, więc moim rozwiązaniem (dla tablic wielowymiarowych) jest użycie array_unique ()
Ogłoszenie:
Działa doskonale . Mam nadzieję, że to samo pomaga.
źródło
array_merge()
nie zachowuje jednak kluczy. Utworzona przez to tablica jest indeksowana do 0.+
. Spójrz na: PHPFiddle , $ b [0] zostanie utracone ...Nowy sposób na zrobienie tego z php7.4 to operator rozprzestrzeniania [...]
$parts = ['apple', 'pear']; $fruits = ['banana', 'orange', ...$parts, 'watermelon']; var_dump($fruits);
Operator spreadu powinien mieć lepszą wydajność niż
array_merge
Istotną zaletą operatora Spread jest to, że obsługuje on wszystkie obiekty, przez które można przechodzić, podczas gdy funkcja array_merge obsługuje tylko tablice.
źródło
https://www.php.net/manual/en/function.array-merge.php
<?php $array1 = array("color" => "red", 2, 4); $array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4); $result = array_merge($array1, $array2); print_r($result); ?>
źródło