2013-12-11 3 views
0

두 개의 배열이 이와 같이 설정되었습니다.PHP는 동일한 키에 두 개의 배열을 병합합니다.

먼저 배열

Array 
(
    [0] => Array 
     (
      [manufacture] => Moto 
      [name] => ZSX 125 
      [code] => ZS125-48A 
      [cc] => 125 
      [bike_type] => 3 Motorcycle 
      [title] => Mto ZSX 125 
      [about] => The ZSX 
     ) 

    [1] => Array 
     (
      [manufacture] => Moto 
      [name] => LSM 125 
      [code] => STR125YB 
      [cc] => 125 
      [bike_type] => 6 Endurancemotor 
      [title] => Moto 
      [about] => Moto 
     ) 
) 

두 번째 배열

Array 
(
    [0] => Array 
     (
      [id] => 183 
      [model] => ZS125-48A 
      [engine_brand] => 158FMI-B 
      [engine_type] => Single Cylinder 
     ) 

    [1] => Array 
     (
      [id] => 172 
      [model] => STR125YB 
      [engine_brand] => K154FMI 
      [engine_type] => Single Cylinder 
     ) 
) 

첫 번째 배열에서 '코드'를 볼 수 있듯이 두 번째에서 '모델'과 동일하며 항상 일치 할 것이다 .

이것은 내가 갖고 싶은 배열입니다.

Array 
(
    [0] => Array 
     (
      [id] => 183 
      [model] => ZS125-48A 
      [engine_brand] => 158FMI-B 
      [engine_type] => Single Cylinder 
      [manufacture] => Moto 
      [name] => ZSX 125 
      [code] => ZS125-48A 
      [cc] => 125 
      [bike_type] => 3 Motorcycle 
      [title] => Moto ZSX 125 
      [about] => The ZSX 
     ) 

    [1] => Array 
     (
      [id] => 172 
      [model] => STR125YB 
      [engine_brand] => K154FMI 
      [engine_type] => Single Cylinder 
      [manufacture] => Moto 
      [name] => LSM 125 
      [code] => STR125YB 
      [cc] => 125 
      [bike_type] => 6 Endurancemotor 
      [title] => Moto 
      [about] => Moto 
     ) 
) 

가능합니까? array_merge 및 array_merge_recursive 시도했지만 첫 번째 끝에있는 두 번째 배열을 추가합니다, 그것은 키를 병합하지 않습니다. 이 그것을해야처럼

+2

DB에서 추출한 것 같습니다. 그렇다면,'model' 컬럼에 결과를 조인하는 것이 더 쉽지 않을 것입니다. –

답변

3

두 배열을 동기화하는 경우 Deceze의 솔루션은 완벽하다 (즉, codemodel이 일치하는 항목은 두 배열에서 같은 인덱스에 있습니다. 그렇지 않은 경우 두 줄 이상의 코드가 필요합니다.

array_merge과 병합하려면 배열에 문자열 키가 있어야합니다. 이 경우 code을 기반으로 첫 번째 키를 다시 만들고 model을 기반으로 두 번째 키를 다시 생성하고 싶습니다. 다시 키 입력 후 array_merge_recursive으로 병합 할 수 있습니다.

Re-keying 기능은 5.5 PHP에서 쉽게 :

// array_column will conveniently rekey when the second argument is null 
$array1 = array_column($array1, null, 'code'); 
$array2 = array_column($array2, null, 'model'); 

약간 더 복잡 이전 버전 :

// array_map is a more complicated way to extract a column from an array 
// and array_combine will do the rekeying 
$array1 = array_combine(
       array_map(function($i) { return $i['code']; }, $array1), 
       $array1); 
$array2 = array_combine(
       array_map(function($i) { return $i['model']; }, $array2), 
       $array2); 

마지막 단계는 같은 것 두 경우 모두 :

$result = array_merge_recursive($array1, $array2); 
+1

+1 나는 배열이 sync'd 것 같아요, 그들은 나에게 OP가'MODEL => CODE' 결과에 참여할 수 있다고 생각하게 만드는 DB의 추출물을 좋아하는 것 같습니다. 직접 선택하는 동안,하지만 그것은 단지 야생 추측이야 :) –

+0

안녕 감사, 설명을 위해 완벽하게 작동합니다. – user3004208

2

나에게 보이는 :

$array3 = array_map('array_merge', $array1, $array2); 

$array1[0]array_merge-$array2[0], 다음 $array1[1]$array2[1] 피드 등

+0

괜찮습니다.하지만 OP의 모든 요구 사항을 충족시키기 위해서는'$ array3 = array_map ('array_merge', $ array2, $ array1); '따라서 ID 키가있는 array2가 앞에 붙습니다. +1 자세한 설명 및 솔루션에 대한 내 –

0

"더 간단한"코드를 선호하는 경우 :

$result = array(); 
foreach ($one as $a) { 
    foreach ($two as $b) { 
     if ($a->code == $b->model) { 
      array_push($result, array_merge($a, $b)); 
      break; 
     } 
    } 
} 
print_r($result); 
관련 문제