2011-12-05 5 views
5

두 개의 다차원 배열을 결합하기 위해 array_combine을 사용하려하지만 어떻게 든 올바르게 수행하지 않습니다. 여기PHP는 두 개의 다차원 배열을 결합합니다.

는 배열 1입니다 :

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

여기에 배열 2입니다 : 내가 뭘

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

: 여기

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

내 작동하지 array_combine에서 시도이다 잘못된? 이것은 내가 찾고있는 결과입니다 :

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

당신의 도움에 감사드립니다.

  • 편집 - 내가 대신 array_merge_recursive 사용하는 경우, 이것이 내가 얻을 내 결과 것으로 나타났습니다

. 나는 가까운 찾고 있지만 아니었다 무엇 :

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 
     ) 
    ) 
) 
  • 멀어져 편집 - 여기

그러나이 작동하지 않습니다, 내가 아래 제안 중 하나를 구현하기 위해 노력했다 방법입니다 나를. 무엇이 잘못 되었나요? :

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

키 참조를 유지하고 싶습니까, 아니면 0 2가 될지 걱정하지 않습니까? 배열에 "C"또는 "I"또는 다른 값을 갖는 두 개의 키를 사용할 수 없습니다. – phpmeh

+0

문자 그대로 ** 왜 ** 모든 질문에 정확히 같은 내용과 배열이 있습니까? 우리는 숙제 나 학교를 준비하고 있습니까? 이것은 말 그대로 지난 주 나 두 달 동안 보았던 그 이전의 것과 거의 같은 당신의 _third_ _ _ _ _ _ _ _ _ _ _ _ 질문입니다. –

+0

@phpmeh, 아니요. 나는 핵심적인 참고 문헌을 유지하고 싶지 않습니다. – DanielAttard

답변

3

array_merge_recursive는 매우 가까운 (당신의 "키"잎 배열의 인덱스 1에, 그리고 값은 인덱스 0에) 가져옵니다. 두 단계로 수행하십시오. 먼저 병합 된 배열을 가져온 다음 분기로 바이올린을 적용하여 올바르게 만듭니다.

// 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); 

재미있게하기 위해 다음 두 가지 방법이 있습니다. 이 두 가지 모두 merge_flatten_branches보다 약간 느리지 만 몇 가지 유용한 배열 개념을 보여줍니다. (php보다 기능적인 다른 언어에서 더 선호 될 수 있습니다.)

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

이것은 매우 시원합니다. 당신의 솔루션은 스포트라이트를 받았다. 정확히 내가 찾던 결과. 이제 그 일이 어떻게 돌아가는지 내 머리를 감쌀뿐입니다. 많은 감사합니다. – DanielAttard

+0

주위를 감싸다 _ 그렇게 되었습니까? 반면에 저는 용어가 의미하는 바를 이해하려고 노력하고 있습니다. 모든 'flatten_leaf'물건은 오히려 밀교입니다. 숨겨진 기능 이름 ... 멋지지 않습니다. 이것이 영리하면서도 의미가없는 함수 이름 콘테스트라면, merge_flatten_branches_reduce는 날으는 색으로 우승 할 것입니다. 그럼에도 불구하고 작동하는 솔루션에 +1하십시오. –

1

찾고 계신 결과는 나에게 맞춤식으로 보입니다. 다시 말하면, 나는 을 가진 내장 PHP 배열 함수를 모른다. 그러나, 나는 당신을 위해 사용자 정의 함수를 작성했다. 경고 :이 경우에 맞춰 매우 적합하므로 아마도 재사용이 아닙니다.

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

답변을 주셔서 감사합니다.하지만 구현하는 데 문제가 있습니다. 나는 지금까지 시도한 것을 보여주기 위해 나의 질문을 편집했다. 내가 잘못한 것을 볼 수 있니? – DanielAttard

+0

'cust_array_merge' 함수는 실제로 아무것도 반환하지 않습니다. 그것이 받아들이는 첫 번째 인수 ('$ array1')는 _reference_ (그러므로'&')에 의한 것입니다. –

+0

병합 된 배열을 반환하도록 변경했습니다. 내 편집 된 기능을 확인하고 그게 당신을 위해 작동합니다. –

관련 문제