2010-01-27 11 views
10

Mam dwie asocjacyjne tablice, które mają wiele treści same, więc chcę połączyć te dwie tablice w taki sposób, że jeśli mam a w tablicy 1 i a w tablicy 2 niż w tablicy 3, powinienem mieć wpisy zarówno dla a's i nie 1.Jak połączyć 2 tablice asocjacyjne w PHP, abyśmy nie zastępowali żadnych duplikatów we wszystkich przypadkach?

próbowałem, używając array_merge ale byłoby zastąpić wpisy w tablicy 1, czy istnieją duplikaty w 2 tablicy próbowałem również używając + ale daje mi błąd krytyczny mówiąc Fatal error: Unsupported operand types in /home/code.php następnie próbowałem robić

(array)$ar3 = (array)$ar1 +(array)$ar2 i wygląda na to, że się sumuje. Chciałbym wiedzieć, czy to jest poprawny sposób, aby to zrobić, a także dlaczego początkowo dostałem błąd krytyczny i działało tak, jak już zdefiniowałem $ ar3, $ ar2, $ ar1 jako typy tablic.

$orders = new Order(); 
$prospectOffers = $orders->getOrder($orderConfNumber); 
$prospectOffersResult = json_decode($prospectOffers,true); 
$shoppingBasket = $cart->getCartItems(); 
var_dump($prospectOffersResult); // Both are arrays 
var_dump($shoppingBasket); //Both are arrays 
(array)$result = (array)$prospectOffersResult+(array)$shoppingBasket; 

Dzięki.

+0

Zobacz ten powiązane pytanie http://stackoverflow.com/questions/2140090/operator-for-array-in-php/2140094#2140094 – Gordon

+0

You są całkowicie uprawnieni do użycia '+ ', to połączy dwie macierze: *" Operator + dołącza elementy pozostałych kluczy z tablic z prawą ręką do leworęcznych, podczas gdy zduplikowane klucze są ** NIE ** zastępowane. "* http: //www.php.net/manual/en/language.operators.array.php Dlaczego musisz rzucić je jako tablicę, zanim nie będę wiedział, że masz dziwny kod;) –

+0

możesz dodać wynik działania 'var_dump 'proszę. skróć je, gdy są bardzo długie. – Gordon

Odpowiedz

1

array_merge() zastąpi duplikaty tylko wtedy, gdy obie tablice contain the same string keys:

Jeśli tablice wejściowe mają takie same klucze fragment, a następnie późniejszą wartość dla że klucz zastąpi poprzedni jeden. Jeśli jednak tablice zawierają klucze numeryczne , późniejsza wartość nie będzie zastępować oryginalnej wartości, ale zostanie dołączona .

Uważam, że takie zachowanie jest oczekiwane. W jaki sposób jesteś w tej sprawie? Powiedzmy, że co byłoby dopuszczalnym wyjściem po scaleniu tablicy?

14

$array1 + $array2 zwróci połączenie dwóch tablic. Jeśli są asocjacyjne, wartości z lewego argumentu będą preferowane, jeśli zderzają się klucze. Dlatego nie jest to rozwiązanie, które chcesz, ponieważ wartości zostaną utracone.

Nie ma nic złego w tym stwierdzeniu, pod warunkiem, że obie zmienne są rozumiane jako tablice. Prawdopodobnie wystąpił błąd krytyczny, ponieważ jedna zmienna była w rzeczywistości obiektem i możliwe jest pomylenie tego przy użyciu var_dump. Dodając typy rzutów, zmusiłeś PHP do przymuszania obu zmiennych do tablic. Jeżeli jeden zmienny przedmiot, to taki efekt:

Z PHP.net Manual

„, jeśli obiekt jest przekształcany w tablicy wynikiem jest macierzą, której elementy są właściwości obiektu. klucze są nazwy zmiennej składowej, z kilkoma wyjątkami: Integer właściwości są unaccessible; prywatne zmienne mają nazwę klasy na początku nazwy zmiennej; chronione zmienne mają „*” poprzedzone nazwą zmiennej. Te wstępnie ustawione wartości mają po zerowej liczbie bajtów po po obu stronach."

Teraz mając dwie tablice dodać, PHP nie miał nic do paniki o. Należy pamiętać, że podczas odlewania dwa argumenty z + było ważne, to było bez sensu rzucać zmienną pan z przypisaniem do. Wyrażenie (array)$foo nie modyfikuj $ foo, ale zwraca nową wartość.Może to nie być intuicyjne z języków, które wymagają deklarowania zmiennych, ale PHP nie jest takim językiem

W twoim drugim numerze nie możesz mieć dwóch tego samego klucza w tablicy, co uniemożliwiłoby indeksowanie tablicy, ponieważ poprawna wartość do zwrócenia byłaby niejednoznaczna .Jeśli chcesz połączyć dwie tablice w bezstratnym dworku, będziesz musiał użyć bardziej skomplikowanego d struktura ata.

Moja sugestia jest użycie tablicy tablic, gdzie:

$a1 = array('a' => 1, 'b' => 2, 'c' => 3); 
$a2 = array('a' => 3, 'b' => 2, 'd' => 2); 

staną:

$a3 = array(
    'a' => array(1, 3), 
    'b' => array(2, 2), 
    'c' => array(3), 
    'd' => array(2) 
); 

i kolejność nie jest określona. Jedyną zauważalną zmianą w strukturze jest to, że wszystkie pierwsze wartości są tablicami, pozwalającymi na skumulowanie wartości duplikatów kluczy. Funkcja ta ma za zadanie i może zrobić z lepszej nazwy:

// array(array) lossless_array_merge([$array1 [, $array2 [, $...]]]) 

function lossless_array_merge() { 
    $arrays = func_get_args(); 
    $data = array(); 
    foreach ($arrays as $a) { 
    foreach ($a as $k => $v) { 
     $data[$k][] = $v; 
    } 
    } 
    return $data; 
} 
+0

Czy możesz wyjaśnić, co ta funkcja naprawdę robi i jak uniknąć nadpisywania wartości? – user260204

+0

Funkcja działa dokładnie tak, jak opisałem za pomocą $ a1, $ a2 i $ a3. Wartości od zduplikowanych kluczy tablic składowych są kumulowane we własnej tablicy, a nie nadpisywane. Aby lepiej zrozumieć, jak się to zachowuje, polecam wypróbowanie funkcji z własnymi danymi testowymi. – erisco

Powiązane problemy