2010-07-20 14 views
176

Jak scalić dwie tablice (jedna z ciągiem => pary wartości i druga z wartościami = = wartości) zachowując ciągi znaków/int? Żadne z nich nigdy się nie pokryją (ponieważ jeden ma tylko łańcuchy, a drugi tylko liczby całkowite).PHP: scalanie dwóch tablic przy zachowaniu kluczy zamiast ponownego indeksowania?

Oto mój aktualny kod (który nie działa, ponieważ array_merge jest ponowne indeksowanie tablicy z kluczami Integer):

// get all id vars by combining the static and dynamic 
$staticIdentifications = array(
Users::userID => "USERID", 
Users::username => "USERNAME" 
); 
// get the dynamic vars, formatted: varID => varName 
$companyVarIdentifications = CompanyVars::getIdentificationVarsFriendly($_SESSION['companyID']); 
// merge the static and dynamic vars (*** BUT KEEP THE INT INDICES ***) 
$idVars = array_merge($staticIdentifications, $companyVarIdentifications); 
+1

To dziwne: według strony doc PHP array_merge * * nie powinien tego robić. Czy klucze łańcuchowe w rzeczywistości ciąg znaków reprezentują liczby całkowite? – owenmarshall

+0

array_merge reindeksuje moją drugą tablicę. tj. zmienia tablicę z 'tablica (123 =>" VALUE123 ")' na 'tablica (0 =>" VALUE123 ")' – Garrett

+0

hmm, to jest interesujące. Przypuszczam, że dokumentacja PHP może być nieco niejasna w tym punkcie. Mówi, co się stanie, jeśli * wszystkie * tablic ma klucze numeryczne, ale nie mówi dokładnie, co się stanie, jeśli tego nie zrobią. –

Odpowiedz

419

Można po prostu „dodać” tablice:

>> $a = array(1, 2, 3); 
array (
    0 => 1, 
    1 => 2, 
    2 => 3, 
) 
>> $b = array("a" => 1, "b" => 2, "c" => 3) 
array (
    'a' => 1, 
    'b' => 2, 
    'c' => 3, 
) 
>> $a + $b 
array (
    0 => 1, 
    1 => 2, 
    2 => 3, 
    'a' => 1, 
    'b' => 2, 
    'c' => 3, 
) 
+34

WOW nie ma mowy! przeciążenie operatora w php ftw! thanks =) – Garrett

+3

Pracował jak urok. –

+35

Bądź BARDZO ostrożny! Operator + nie jest dodatkiem, to związek. Jeśli klawisze się nie nakładają, wszystko jest w porządku, ale jeśli ... – GordonM

39

Biorąc pod uwagę, że masz

$replaced = array('1' => 'value1', '4' => 'value4'); 
$replacement = array('4' => 'value2', '6' => 'value3'); 

Doing wyjście $merge = $replacement + $replaced; będzie:

Array('1' => 'value1', '4' => 'value2', '6' => 'value3'); 

Pierwsza tablica z sumy będzie miała wartości w końcowym wyjściu.

Doing wyjście $merge = $replaced + $replacement; wola:

Array('1' => 'value1', '4' => 'value4', '6' => 'value3'); 
+0

[[thumbsup]] na tym jednym –

+16

Podsumowując, przy dodawaniu 2 tablic, wartości z pierwszych wartości nadpisujących z drugiego. – Dziamid

+0

Myślałem, że drugi zastąpi pierwszy. :) –