2011-12-05 16 views
5

Próbuję użyć array_combine, aby połączyć dwa wielowymiarowe tablice, ale jakoś nie robić tego poprawnie.PHP łączą dwie tablice wielowymiarowe

Oto array1:

Array(
    [Nov 18, 2011] => Array(
     [C] => 107705.5792 
     [I] => 44561.52 
    ) 
    [Nov 22, 2011] => Array(
     [C] => -8992.8352 
    ) 
) 

i tu jest tablica2:

Array(
    [Nov 18, 2011] => Array(
     [C] => 3 
     [I] => 1 
    ) 
    [Nov 22, 2011] => Array(
     [C] => 2 
    ) 
) 

Oto moja próba array_combine, który nie działa:

$array1 = ($arr1); 
$array2 = ($arr2); 
$result = array_combine($arr1, $arr2); 
echo '<pre>'; 
print_r($result); 
echo '</pre>'; 

Co robię źle? Oto rezultat, którego szukam:

Array(
    [Nov 18, 2011] => Array(
     [3] => 107705.5792 
     [1] => 44561.52 
    ) 
    [Nov 22, 2011] => Array(
     [2] => -8992.8352 
    ) 
) 

Dzięki za pomoc.

  • EDIT -

znalazłem, że jeśli zamiast używać array_merge_recursive, to mój wynik, że mam. Nie to, czego szukałem, ale blisko:

Array(
    [Nov 18, 2011] => Array(
     [C] => Array(
      [0] => 3 
      [1] => 107705.5792 
     ) 
     [I] => Array(
      [0] => 1 
      [1] => 44561.52 
     ) 
    ) 
    [Nov 22, 2011] => Array(
     [C] => Array(
      [0] => 2 
      [1] => -8992.8352 
     ) 
    ) 
) 
  • INNE EDIT -

Oto sposób, że starałem się realizować jeden z poniższych sugestii, jednak nie jest to praca dla mnie. Co jest nie tak ?:

function cust_array_merge(array &$array1, array $array2){ 
    // loop through main array 
    foreach ($array1 as $key => $val) { 
     // check if $array2 has the same index 
     if (array_key_exists($key, $array2)) { 
      // reset $array1's indexes to $array2's values 
      foreach ($array2[$key] as $subKey => $subVal) { 
       if (array_key_exists($subKey, $array1[$key])) { 
        $tempVal = $array1[$key][$subKey]; 
        unset($array1[$key][$subKey]); 
        $array1[$key][$subVal] = $tempVal;}}}}} 

$merged = cust_array_merge($arr_cats_per_bill_date, $arr_cvat); 
echo '<pre>'; 
    print_r($merged); 
echo '</pre>'; 
+0

Czy chcesz zachować kluczowe referencje, czy nie obchodzi cię, że stanie się 0 1 2? Nie możesz mieć dwóch kluczy "C" lub "I" ani żadnej innej wartości w swojej tablicy. – phpmeh

+0

Dlaczego dosłownie ** WSZYSTKO ** z twoich pytań ma dokładnie tę samą zawartość i tablice? Czy robimy twoją pracę domową czy coś w szkole? Jest to dosłownie trzecie lub drugie pytanie, które widziałem w ostatnim tygodniu lub dwóch, które jest prawie dokładnie takie samo jak poprzednie. –

+0

@phpmeh, nie, nie chcę zachować kluczowych odniesień. – DanielAttard

Odpowiedz

3

array_merge_recursive dostaje bardzo blisko (Twój „klucz” jest w indeksie 1 tablic liści, a wartość indeksu 0). Zrób to w dwóch krokach: najpierw uzyskaj scaloną tablicę, a następnie skrzypnij się z gałęziami, aby to naprawić.

// This is a callback for array_map() which should have some more generic uses. 
// array(array('k', 'v'), ...) -> array('k' => 'v', ...) 
function flatten_branches($branches) { 
    $newleaves = array(); 
    foreach ($branches as $leaf) { 
     $newleaves[$leaf[0]] = $leaf[1]; 
    } 
    return $newleaves; 
} 

function merge_flatten_branches($karray, $varray) { 
    //$karray has the key-leaves, and $varray has the value-leaves 
    $m1 = array_merge_recursive($karray, $varray); 
    return array_map('flatten_branches', $m1); 
} 

$merged = merge_flatten_branches($array2, $array1); 
print_r($merged); 

Dla przyjemności, oto dwa dodatkowe podejścia. Oba są nieco wolniejsze niż merge_flatten_branches, ale ilustrują niektóre przydatne koncepcje macierzy. (W innych językach o bardziej funkcjonalnym smaku niż php, mogą być one preferowane.)

function merge_flatten_branches_reduce($karray, $varray) { 
    //$karray has the key-leaves, and $varray has the value-leaves 
    $m1 = array_merge_recursive($karray, $varray); 
    return array_map('flatten_branches_reduce', $m1); 
} 

function merge_flatten_branches_add($karray, $varray) { 
    //$karray has the key-leaves, and $varray has the value-leaves 
    $m1 = array_merge_recursive($karray, $varray); 
    return array_map('flatten_branches_add', $m1); 
} 

// The functions below are callbacks for the two above. 

function array_add($a1, $a2) { 
    return $a1+$a2; 
} 

function flatten_leaf($leaf) { 
    return array($leaf[0] => $leaf[1]); 
} 

function flatten_branches_add($branches) { 
    $leaves = array_map('flatten_leaf', ($branches)); 
    $finalleaves = array(); 
    foreach ($leaves as $leaf) { 
     $finalleaves += $leaf; 
    } 
    return $finalleaves; 
} 


function flatten_branches_reduce($branches) { 
    $l = array_map('flatten_leaf', ($branches)); 
    return array_reduce($l, 'array_add', array()); 
} 
+0

To jest bardzo fajne Francis. Twoje rozwiązania były natychmiastowe. Dokładnie wynik, którego szukałem. Teraz muszę położyć głowę na tym, jak to się stało. Wielkie dzięki. – DanielAttard

+0

Owiń głowę _ jak to się stało? Ja natomiast próbuję po prostu zrozumieć, co to znaczy, że terminologia ma znaczyć. Wszystko, co "flatten_leaf" jest raczej ezoteryczne. Cryptyczne nazwy funkcji ... nie są cool. Gdyby to był sprytny, ale bez znaczenia, konkurs nazw funkcji, "merge_flatten_branches_reduce" wygrałby z latającymi kolorami lol. Niemniej jednak +1 za działające rozwiązanie. –

1

Rezultat, którego szukasz, wygląda naprawdę dla mnie niestandardowo. To znaczy, nie znam żadnych wbudowanych funkcji tablic PHP, które mogłyby zrobić , że. Jednak napisałem dla ciebie niestandardową funkcję. Ostrzeżenie:: jest bardzo dostosowany do tej okazji, a zatem prawdopodobnie nie jest zbytnio użyty do ponownego użycia.

function cust_array_merge(array $array1, array $array2) 
{ 
    $merged = array(); 
    // loop through main array 
    foreach ($array1 as $key => $val) { 
     // check if $array2 has the same index 
     if (array_key_exists($key, $array2)) { 
      // reset $array1's indexes to $array2's values 
      foreach ($array2[$key] as $subKey => $subVal) { 
       if (array_key_exists($subKey, $array1[$key])) { 
        $tempVal = $array1[$key][$subKey]; 
        unset($array1[$key][$subKey]); 
        $array1[$key][$subVal] = $tempVal; 
       } 
      } 
      $merged = $array1; 
     } 
    } 
    return $merged; 
} 
+0

dziękuję za odpowiedź, ale mam problemy z jej wdrożeniem. Zmieniłem moje pytanie, aby pokazać ci, co próbowałem do tej pory. Czy widzisz, co zrobiłem źle? – DanielAttard

+0

Funkcja 'cust_array_merge' nie zwraca niczego. Pierwszy argument, który akceptuje ('$ tablica1'), pochodzi od _referencji_ (stąd' & '). –

+0

Zmieniłem go, aby teraz zwrócił scaloną tablicę. Sprawdź moją edytowaną funkcję, która powinna działać. –

Powiązane problemy