2012-05-05 4 views
3

각 ID 아래에 다차원 정보가있는 ID를 기본 키로 포함하는 많은 배열이 있습니다.PHP에서 배열 교차를 수행 할 때 어떻게 다차원 배열 정보를 보존 할 수 있습니까?

첫 번째 예 배열 :

array 
    14181 => 
    array 
     'industries' => 
     array 
      'weight' => string '105652' (length=6) 
      'count' => string '11' (length=2) 
    48354 => 
    array 
     'industries' => 
     array 
      'weight' => string '508866' (length=6) 
      'count' => string '10' (length=2) 

두 번째 예 배열 :

array 
    16434 => 
    array 
     'business_types' => 
     array 
      'weight' => string '104614' (length=6) 
      'count' => string '1' (length=1) 
    48354 => 
    array 
     'business_types' => 
     array 
      'weight' => string '103610' (length=6) 
      'count' => string '10' (length=2) 

내가이를 근거로이 같은 많은 배열의 교회법을 (좀하고 싶습니다 여기에 두 가지 예 키에),하지만 각 키에 대한 각 배열의 무게와 개수 데이터를 보존해야합니다. 각 어레이의 무게와 개수가 다른 데이터인지 확인하십시오. 이 경우 business_type 및 업종.

array 
    48354 => 
    array 
     'business_types' => 
     array 
      'weight' => string '103610' (length=6) 
      'count' => string '10' (length=2) 
     'industries' => 
     array 
      'weight' => string '508866' (length=6) 
      'count' => string '10' (length=2) 

원래 나는 무게와 수를 유지하기 위해 노력하지 않은, 그래서 나는 단순히 array_intersect_keys()을 수행하고 작업이 이루어졌다 :

최종 배열이 필요. 이제이 데이터를 보관해야합니다. 서브 배열의 이름을 array_intersect_keys()이 유지하기를 희망하면서 다른 것으로 명명했지만 함수의 첫 번째 배열에 대해서만 보존합니다.

이렇게하는 것이 더 좋은 방법이 있습니까?

내가 해결할 수있는 유일한 해결책은 모든 배열을 최종 ID (키) 목록으로 축소 한 다음 비교 한 원래 배열 각각에서 가중치 및 개수 정보를 가져 오는 배열을 반복하는 것입니다.

+0

솔루션 당신이 제안은 나에게 좋은 소리. –

+0

방금 ​​배열 병합을 썼지 만 지금 다시 읽었으니 교차로를 찾고 있니? 맞습니까? – jedwards

+0

교차를해야하지만 데이터를 병합해야합니다. 내 솔루션의 역순으로 수행했다고 생각하지만 여전히 유효 할 수 있습니다. –

답변

0

제안 된 솔루션은 괜찮은 것처럼 보이지만 한 목록을 다른 목록으로 병합하는 것이 좋습니다.

<?php 

$a1 = array(14181 => array('industries'  => array('weight' => "105652", 'count' => "11")), 
      48354 => array('industries'  => array('weight' => "508866", 'count' => "10"))); 
$a2 = array(16434 => array('business_types' => array('weight' => "104614", 'count' => "1")), 
      48354 => array('business_types' => array('weight' => "103610", 'count' => "10"))); 

//print_r($a1); 
//print_r($a2); 

foreach($a2 as $a2k => $a2v) 
{ 
    // The loop below should only go through once, but if there are multiple types it will be ok 
    foreach($a2v as $a2vk => $a2vv) 
    { 
     $a1[$a2k][$a2vk] = $a2vv; 
    } 
} 

printf("Output:\n"); 
print_r($a1); 

printf("Output:\n"); 
print_r($a1); 

출력 :

Output: 
Array 
(
    [14181] => Array 
     (
      [industries] => Array 
       (
        [weight] => 105652 
        [count] => 11 
       ) 

     ) 

    [48354] => Array 
     (
      [industries] => Array 
       (
        [weight] => 508866 
        [count] => 10 
       ) 

      [business_types] => Array 
       (
        [weight] => 103610 
        [count] => 10 
       ) 

     ) 

    [16434] => Array 
     (
      [business_types] => Array 
       (
        [weight] => 104614 
        [count] => 1 
       ) 

     ) 

) 

나는이 제안 된 솔루션보다 약간 더 빠를 것이라고 생각합니다.


편집 : 위는 키가 배열 사이에 공통되지 않은 경우에도 배열을 병합 할 배열 병합 형 알고리즘이었다. 아래 알고리즘은 두 배열 중 교차만을 생성합니다. 처음 질문을 받고 나의 오류 :

<?php 

$a1 = array(14181 => array('industries'  => array('weight' => "105652", 'count' => "11")), 
      48354 => array('industries'  => array('weight' => "508866", 'count' => "10"))); 
$a2 = array(16434 => array('business_types' => array('weight' => "104614", 'count' => "1")), 
      48354 => array('business_types' => array('weight' => "103610", 'count' => "10"))); 

//print_r($a1); 
//print_r($a2); 

// Pass the smaller array as first argument 
if(count($a1) <= count($a2)) 
{ 
    $res = my_merge($a1, $a2); 
} 
else 
{ 
    $res = my_merge($a2, $a1); 
} 

function my_merge($a1, $a2) 
{ 
    $res = array(); 
    foreach($a1 as $a1k => $a1v) 
    { 
     if(array_key_exists($a1k, $a2)) 
     { 
      $res[$a1k] = array_merge($a1[$a1k], $a2[$a1k]); 
     } 
    } 
    return $res; 
} 

printf("Output:\n"); 
print_r($res); 

출력 :

Array 
(
    [48354] => Array 
     (
      [industries] => Array 
       (
        [weight] => 508866 
        [count] => 10 
       ) 

      [business_types] => Array 
       (
        [weight] => 103610 
        [count] => 10 
       ) 

     ) 

) 
+0

그러면 결합 된 배열을 모든 원본 배열에있는 ID (및 하위 배열)로 축소하는 방법은 무엇입니까?또는이 경우 산업체와 business_type 가중치 및 개수를 모두 가진 ID로 변환 할 수 있습니까? –

+0

나는 내 게시물을 편집하고 병합 알고리즘 대신 교차 알고리즘을 추가했습니다. 예, 병합을 사용하여 축소 할 수는 있지만 편집에 사용한 방법이 더 빠를 것이라고 생각합니다. – jedwards