2011-07-25 11 views
9

Jak mogę zrobić array_merge na tablicy asocjacyjnej, tak:Array-Merge na tablicy asocjacyjnej w PHP

Array 1:

$options = array (
"1567" => "test", 
"1853" => "test1", 
); 

Array 2:

$option = array (
"none" => "N/A" 
); 

Więc potrzebuję array_merge tych dwóch, ale kiedy mam to dostać (w debugowaniu):

Array 
(
    [none] => N/A 
    [0] => test 
    [1] => test1 
) 
+0

_ "[Wartości w tablicy wejściowej z klawiszami numerycznymi zostaną ponumerowane z przyrostowymi klawiszami zaczynającymi się od zera w tablicy wyników.] (Http://php.net/manual/en/function.array-merge.php) "_. Jeśli możesz zmienić klawisze tablicy '$ options', aby zawierały jakiś ciąg znaków, wtedy [będzie działać poprawnie] (http://codepad.org/d5DbFdas). – Shef

+0

@Shef: Powinieneś wspomnieć: Non-Numeric string. – hakre

Odpowiedz

12

spróbuj:

$ finalArray = $ opcji + $ option. see http://codepad.org/BJ0HVtac Ju st sprawdź zachowanie duplikatów kluczy, nie przetestowałem tego. Dla unikalnych kluczy działa świetnie.

<?php 

$options = array (
        "1567" => "test", 
        "1853" => "test1", 
       ); 


$option = array (
"none" => "N/A" 
); 


$final = array_merge($option,$options); 

var_dump($final); 


$finalNew = $option + $options ; 

var_dump($finalNew); 

?> 
+1

Oto jak php obsługuje duplikaty kluczy: http://codepad.org/jpeynFf1 – NickSoft

+1

Pamiętaj również, że po scaleniu klawisze będą miały "0" i "1". Funkcja array_merge() resetuje klawisze numeryczne! – ram4nd

0

gdy array_merge nie działa, to po prostu zrobić

<?php 
$new = array(); 
foreach ($options as $key=>$value) $new[$key] = $value; 
foreach ($option as $key=>$value) $new[$key] = $value; 
?> 

lub przełączyć dwa foreach pętle zależności od tablica ma wyższy priorytet

1

szukałem scalić dwie tablice asocjacyjne razem, dodając wartości razem, jeśli klucze były takie same. Jeśli istnieją klucze unikatowe dla każdej z tablic, zostaną one dodane do scalonej tablicy z ich istniejącymi wartościami.

mogłam znaleźć funkcję, aby to zrobić, więc się następująco:

function array_merge_assoc($array1, $array2) 
{ 

    if(sizeof($array1)>sizeof($array2)) 
    { 
     echo $size = sizeof($array1); 
    } 
    else 
    { 
     $a = $array1; 
     $array1 = $array2; 
     $array2 = $a; 

     echo $size = sizeof($array1); 
    } 

    $keys2 = array_keys($array2); 

    for($i = 0;$i<$size;$i++) 
    { 
     $array1[$keys2[$i]] = $array1[$keys2[$i]] + $array2[$keys2[$i]]; 
    } 

    $array1 = array_filter($array1); 
    return $array1; 
} 

referencyjny: http://www.php.net/manual/en/function.array-merge.php#90136

11

Po prostu użyj $options + $option!

var_dump($options + $option); 

wyjścia:

array(3) { 
    [1567]=> 
    string(4) "test" 
    [1853]=> 
    string(5) "test1" 
    ["none"]=> 
    string(3) "N/A" 
} 

Ale bądź ostrożny, gdy istnieje klucz kolizji. Oto, co mówi PHP manual:

Klucze z pierwszej tablicy zostaną zachowane. Jeśli klucz tablicy istnieje w obu tablicach, zostanie użyty element z pierwszej tablicy, a element odpowiadającego klucza z drugiej tablicy zostanie zignorowany.

1
$final_option = $option + $options; 
0

Kod ten może być stosowany do rekurencyjnego Merge:

function merge($arr1, $arr2){ 
     $out = array(); 
     foreach($arr1 as $key => $val1){ 
      if(isset($arr2[$key])){ 
       if(is_array($arr1[$key]) && is_array($arr2[$key])){ 
        $out[$key]= merge($arr1[$key], $arr2[$key]); 
       }else{ 
        $out[$key]= array($arr1[$key], $arr2[$key]); 
       } 
       unset($arr2[$key]); 
      }else{ 
       $out[$key] = $arr1[$key]; 
      } 
     } 
     return $out + $arr2; 
} 
0

Jeżeli macierze posiadające te same klucze następnie użyć array_merge_recursive()

$array1 = array("a" => "1" , "b" => "45"); 

$array2 = array("a" => "23" , "b" => "33"); 

$newarray = array_merge_recursive($array1,$array2); 

array_merge_recursive() przyzwyczajenie zastąpić, to właśnie sprawia, że ​​wartość jako tablica.

Powiązane problemy