2012-04-25 4 views
0

다음은 비교할 두 배열입니다.php 배열 비교의 효율적인 방법

array_a(
[0] => array('userid' => aaa, 'created_time' => XXXX,), 
[1] => array('userid' => bbb, 'created_time' => XXXX,), 
[2] => array('userid' => ccc, 'created_time' => XXXX,) 
) 


array_b(
[0] => array('userid' => aaa, 'created_time' => XXXX,), 
[1] => array('userid' => ccc, 'created_time' => XXXX,), 
[2] => array('userid' => ddd, 'created_time' => XXXX,) 
) 

나는 다음과 같은 조건에 일치하는 모든 요소를 ​​검색 싶어 : array_a의 사용자 ID는 array_b에 있으며 array_a의 created_time는보다 새로운 array_b의

나는이 작업을 수행하려면 다음 코드를 사용하지만, 그것은 걸릴 것입니다 배열이 거대하면 오랜 시간이 걸린다.

for array_a{ 
    for array_b{ 
    if (a[user_id] = b[user_id] && a[created_time] > b[created_time]) { 
     //target got 
    } 
    } 
} 

이 논리를 효율적으로 수행 할 방법이 있습니까?

답변 해 주셔서 감사합니다. ID는 고유합니다. 변환하는 방법 array_a ([0] => array ('userid'=> aaa, 'created_time'=> XXXX), [1] => 배열 ('userid'=> bbb, 'created_time'=> XXXX), 형태 어레이 (AAA = "XXXX, BBB ="XXXX)로 )

?

+1

여기서 할 수있는 것은 배열을'array ('aaa'=> XXXX, 'bbb'=> XXXX)와 같이 변경하는 것뿐입니다. 특히 데이터가이 형식으로되기 전에 작업을 수행 할 수 있다면 (작업에 적합하지 않음). – Jon

+3

모든 사용자 ID가 고유하면 배열 B를'arrayB [user_id] => created_time'에 먼저 매핑 할 수 있습니다. 그런 다음 배열 A를 반복하고 배열 B에서 사용자 ID를 검색하면됩니다 ('O (1)'). 그것은'O (n^2) '대신'O (2n)'주위에 있습니다. –

+0

사용자 ID가 정렬 된 순서입니까? – Jack

답변

1
foreach($array_a as $arr) 
    $tmp[$arr['userid']] = $arr['created_time']; //rebulding first array 

foreach($array_b as $arr) 
    if(isset($tmp[$arr['userid']]) && $arr['created_time'] < $tmp[$arr['userid']]){ 
    //target 
    } 

은 첫째 당신은 당신이 당신의 조건을 충족 항목을 검색합니다 다음 단계에 적합한 구조화하는 배열 중 하나를 다시 작성해야합니다. 이 솔루션은 루프 수 (N^2 대신 2 * n)가 더 적기 때문에이 솔루션을 사용해야합니다.

+4

글쎄, 어때? 너 자신에 대한 질문을하고 있니? – Jon

+0

좋아, 게으른 b ******에 대한 코드를 업데이트했다. 은판에 모든 것을 제공하고 싶다. (내 영어로는 유감이다. 당신이 나를 이해할 수 있기를 희망한다.) – miro

+0

유감 스럽지만 코드가 유용한 많은 것을 할 수있는 많은 메모리. 'created_time'이 역할을하는 부분을 놓치셨습니까? – Jon

0

각 요소의 userid를 배열 키로 사용할 수 있습니다. 이렇게하면 O (1) 시간에 B에서 올바른 항목을 찾을 수 있습니다.

0

사용자 ID별로 두 어레이를 정렬 한 다음 시간을 작성하십시오. 순서는 여전히 O (N^2)이지만 비교 횟수는 크게 줄어 듭니다. 그러나 사용자 ID에 명시 적으로 일치하는 것을 찾고 있기 때문에 배열을 array ('aaa'=> 배열 (0 => 'created_time', 1 => 'created_time'...) ...)로 변환하면 점점 array_intersect (array_a, array_b)의 값은 모든 일반적인 사용자 ID를 제공합니다. 사용자 ID의의는 모두 같은 순서로 정렬하는 경우

0
$b_index = 0; 
for ($a_index = 0; $a_index < count($a); $a_index++) 
{ 
    if ($a[$a_index]['userid'] == $b[$b_index]['userid']) 
    { 
     if ($a[$a_index]['created_time'] >= $b[$b_index]['created_time']) 
      $array[] = $a[$a_index]; 
     $b_index++; 
    } 
} 

, 당신은 일치를 찾기 위해 B의 각각의 사용자 ID와에 비해 각 사용자 ID에 필요하지 않습니다. 이것은 최소한 비교가되어야합니다.