2012-07-24 5 views
0

PHP에서 두 개의 2D 배열을 비교해야합니다. 배열은 다음과 같이 :PHP에서 ID별로 두 배열 결합하기

Array one 
ID Name 
11 Aa 
11 Ab 
12 Bb 
13 Cc 
14 Dd 
15 Ee 

Array two 
ID Content 
11 Cat 
13 Dog 
14 Donkey 

지금 나는이 같은 배열로이 두 가지를 결합해야 것 :

ID Name Conent 
11 Aa Cat 
11 Ab Cat 
12 Bb 
13 Cc Dog 
14 Dd Donkey 
15 Ee 

가 어떻게 이러한 목표를 달성 할 수 있습니까? 나는 array_merge() 또는 $ array3 = $ array1 + $ array2와 아무런 운이 없었습니다;

+1

당신은 단지 하나의 문자열로 동일한 ID 년대와 두 개의 문자열을 연결하려고, 또는 여러 값을 갖는 본질적으로 하나의 키가하려고하는 문자열 키를 필요로하는? –

+0

array_merge/addition은 배열의 차원을 변경하지 않습니다. 2 개의 1x10 어레이로 피드하면 2x10 또는 4x5가 아닌 1x20으로 끝납니다. –

+0

마지막으로 SQL 쿼리를 변경하여이 문제를 해결했습니다. php는 복잡한 배열 작업에 적합하지 않은 것 같습니다. :-( – user1548619

답변

0

당신은 당신의 자신의 기능을해야 할 것이다 :

function putThemTogether($array1, $array2) { 
    $output = array(); 
    foreach($array1 as $key => $value) { 
     if (!isset($output[$key])) 
      $output[$key] = array(); 
     $output[$key][] = $value; 
    } 
    foreach($array2 as $key => $value) { 
     if (!isset($output[$key])) 
      $output[$key] = array(); 
     $output[$key][] = $value; 
    } 
    return $output; 
} 

당신이 그것을 임의의 수의 인수를 만들 수있는이 더 나은하려면.

3

빠른 방법은 첫 번째 배열을 반복하고, 두번째의 값을 추가하는 것 :

$array1 = array('11' => 'Aa', '12' => 'Bb', '13' => 'Cc', '14' => 'Dd', '15' => 'Ee'); 
$array2 = array('11' => 'Cat', '13' => 'Dog', '14' => 'Donkey'); 

$combined = array(); 
foreach ($array1 as $key => $val) { 
    $combined[$key] = $val . (isset($array2[$key]) ? ' '.$array2[$key] : ''); 
} 

$array1 모든 키/값을 통해이 뜻 루프 및 $combined 어레이에 추가한다. $array2의 값이 동일한 색인에 있으면 $array1의 값에 공백으로 구분하여 추가합니다.

업데이트 : 배열의 형식을 잘못 읽었습니다 (다시). 나는 ID을 배열의 실제 인덱스라고 가정했지만 예제 배열 출력은 NameContent을 가지고 있기 때문에 ID은 배열 자체의 인덱스가 아닌 실제 인덱스 문자열 값입니다. 루프 시나리오를 고수하기 위해, 당신은 두 번째를 통해 첫 번째 배열을 통해 반복과 중첩 루프 반복 처리를 할 수 있습니다 :

$array1 = array(
     array('ID' => '11', 'Name' => 'Aa'), 
     array('ID' => '12', 'Name' => 'Bb'), 
     array('ID' => '13', 'Name' => 'Cc'), 
     array('ID' => '14', 'Name' => 'Dd'), 
     array('ID' => '15', 'Name' => 'Ee'), 
    ); 
$array2 = array(
     array('ID' => '11', 'Content' => 'Cat'), 
     array('ID' => '13', 'Content' => 'Dog'), 
     array('ID' => '14', 'Content' => 'Donkey') 
    ); 

$combined = array(); 
foreach ($array1 as $arr) { 
     $comb = array('ID' => $arr['ID'], 'Name' => $arr['Name'], 'Content' => ''); 
     foreach ($array2 as $arr2) { 
      if ($arr2['ID'] == $arr['ID']) { 
       $comb['Content'] = $arr2['Content']; 
       break; 
      } 
     } 
    $combined[] = $comb; 
} 

이 결합 된 배열에와있는 경우 $array1의 모든 값을 추가 만하는 경우 것 $array2의 값은 동일한 ID 필드를 포함하므로 배열에 Content 필드도 추가됩니다. 이 이름을 사용하거나 inner-if 블록을 대신 $comb += $arr2; (모든 존재하지 않는 인덱스를 병합해야 함)으로 변경하여 여러 필드를 처리 할 수 ​​있습니다.

0
$result = array_map (
    function ($item) { return is_array($item) ? implode(' ', $item) : $item; }, 
    array_merge_recursive($array1, $array2); 
); 

주, 두 배열이