2010-04-16 14 views
38

Niedawno nauczyłem się, jak dołączyć do 2 tablic używając operatora + w PHP.Nie można połączyć 2 tablic w PHP

Ale rozważyć ten kod ...

$array = array('Item 1'); 

$array += array('Item 2'); 

var_dump($array); 

Wyjście jest

array (1) {[0] => string (6) "Artykuł 1"}

Dlaczego to nie działa? Pomijanie skrótu i ​​używanie $array = $array + array('Item 2') również nie działa. Czy ma to coś wspólnego z kluczami?

+0

* (powiązane) * http://stackoverflow.com/questions/2140090/operator-for-array-in-php/2140094#2140094 – Gordon

Odpowiedz

88

Oba będą miały klucz o numerze 0, a ta metoda łączenia macierzy spowoduje zwinięcie duplikatów. Zamiast tego spróbuj użyć array_merge().

$arr1 = array('foo'); // Same as array(0 => 'foo') 
$arr2 = array('bar'); // Same as array(0 => 'bar') 

// Will contain array('foo', 'bar'); 
$combined = array_merge($arr1, $arr2); 

Jeśli elementy macierzy używane różne klucze, operator + byłoby bardziej odpowiednie.

$arr1 = array('one' => 'foo'); 
$arr2 = array('two' => 'bar'); 

// Will contain array('one' => 'foo', 'two' => 'bar'); 
$combined = $arr1 + $arr2; 

Edycja: Dodano fragment kodu w celu wyjaśnienia

+12

Należy zauważyć, że funkcja array_merge nadal zwinie duplikaty nieliczbowych kluczy tablicowych. np. array_merge (array ("color" => "red"), array ("color" => "green")) wytworzy wartość tablicy ("color" => "green"; –

+0

$ arr1 = array (' foo '); // To samo co array (0 =>' foo ') $ arr2 = tablica (' bar '); // To samo co tablica (0 =>' bar ') // Zawiera tablicę (' bar "); $ combined = array_merge ($ arr1, $ arr2); –

-3

Spróbuj powiedzieć

$array[] = array('Item 2'); 

Chociaż wygląda na to, że próbujesz dodać tablicę w tablicę, więc $array[][] ale to nie to, co sugeruje tytuł.

+2

Nie to samo. Otrzymasz 'tablicę ('Item 1', array ('Item 2'))', tablicę wielowymiarową. – deceze

+1

Dobrze, właśnie tego chciałem. –

3

Wypróbuj array_merge.

$array1 = array('Item 1'); 

$array2 = array('Item 2'); 

$array3 = array_merge($array1, $array2); 

Myślę, że dlatego, że nie są przypisywania klawiszy albo, więc obaj mają klawisz 0, a + nie ponownie indeksu, więc jej próbując ponad pisać.

2
$array = array('Item 1'); 

array_push($array,'Item 2'); 

lub

$array[] = 'Item 2'; 
6

+ nazywa operatora Union, który różni się od operatorem konkatenacji (PHP nie posiada ona na macierzach). description wyraźnie mówi:

Operator + dołącza elementy pozostałych klawiszy z prawej przekazanej tablicy do leworęczny, natomiast klawisze powielający nie są nadpisywane.

Z przykład:

$a = array("a" => "apple", "b" => "banana"); 
$b = array("a" => "pear", "b" => "strawberry", "c" => "cherry"); 
$c = $a + $b; 

array(3) { 
    ["a"]=> 
    string(5) "apple" 
    ["b"]=> 
    string(6) "banana" 
    ["c"]=> 
    string(6) "cherry" 
} 

Ponieważ obie twoje tablice mają jeden wpis z kluczem 0, oczekuje się, że wynik.

Aby połączyć, użyj array_merge.

2

To rzeczywiście kluczowy konflikt. Podczas łączenia tablic duplikaty kluczy nie są zastępowane.

Zamiast tego należy użyć array_merge()

$array = array_merge(array('Item 1'), array('Item 2')); 
6

Wszystkie poprzednie odpowiedzi są nieprawidłowe! Scalenie faktycznie łączy tablice, co oznacza, że ​​jeśli tablice mają wspólny element, jedna z kopii zostanie pominięta. To samo dotyczy związku.

nie znaleźć „obejście” tego problemu, ale rzeczywiście to zrobić ręcznie ...

tu idzie:

<?php 
$part1 = array(1,2,3); 
echo "array 1 = \n"; 
print_r($part1); 
$part2 = array(4,5,6); 
echo "array 2 = \n"; 
print_r($part2); 
$ans = NULL; 
for ($i = 0; $i < count($part1); $i++) { 
    $ans[] = $part1[$i]; 
} 
for ($i = 0; $i < count($part2); $i++) { 
    $ans[] = $part2[$i]; 
} 
echo "after arrays concatenation:\n"; 
print_r($ans); 
?> 
+12

To jest fałsz." array_merge "pominie tylko elementy z wypadkowej tablicy, jeśli są one _assocjatywne_ tablice z tymi samymi kluczami. Dla tablic numerycznych, _all_ elementy są scalony w nową tablicę, której długość jest dokładną sumą oryginalnych tablic: W przykładzie używasz tablic numerycznych, co oznacza, że ​​'array_merge' będzie działał bezbłędnie dla ciebie.Zgadzam się, że' array_merge' nie powinien być używany dla tablice asocjacyjne, ale oczywiście to nie jest to, co tu pokazujesz . – JMTyler

+0

@JMTyler +1 doskonały komentarz! Powinienem wybrać przykład wykorzystujący tablice asocjacyjne. Głównym powodem, dla którego napisałem tę odpowiedź, było to, że przyjęta odpowiedź użyła słowa "+", które nie powinno być używane w żadnym z przypadków (skojarzonym lub nie), chyba że klucze są różne. Oraz array_merge, który będzie zawierał zduplikowane elementy w przypadku identycznych elementów. – alfasin

+1

"Wszystkie poprzednie odpowiedzi są nieprawidłowe" nie jest pomocne, ponieważ odpowiedzi są porządkowane w zależności od głosów. –

-5

można użyć operatora. $ array3 = $ tablica1. $ Tablica2;

+2

To jest operator konkat. W efekcie otrzymasz kilka powiadomień i "ArrayArray". –

Powiązane problemy