2009-10-29 5 views
0

다음 2 개의 배열이 있으며이를 결합하려고합니다. 나는 그들의 가치보다 열쇠에 더 관심이있다. 나는이연관 배열 키를 그룹화하는 순서가 같습니다.

$arr1 = array(
    'tom' => "1", 
    'sally' => "20" // unique 
    'larry' => "2", 
    'kate' => "3", 
    'dave' => "23" //unique 
); 

$arr2 = array(
    'tom' => "11", 
    'larry' => "12", 
    'drummer' => "2", // unique 
    'kate' => "7", 
    'nick' => "3"  //unique 
); 

을 가지고 마술은 내가 전에 무엇 후 /를 기반으로 정확한 지점/위해 독특한 아무것도 삽입 할 필요가있다이

$arr = array(
    'tom', 
    'sally',  //unique from arr1, ended up here because she's before larry 
    'drummer', //unique from arr2, ended up here because he's after larry 
    'larry', 
    'kate', 
    'dave',  //unique from arr1, ended up here because he's after the last 2 similar 
    'nick'  //unique from arr2, ended up here because he's after the last 2 similar 
); 

처럼 뭔가로 돌려 싶습니다 그것. 감사합니다.

+2

이 순서는 나에게 이해가되지 않습니다를. "drummer"가 최종 배열에서 "larry"뒤에 있었던 것은 논리적이고 구현 가능합니다. 귀하의 예제에서 그들은 오히려 임의의 원래 배열에 비해 역순으로 있습니다. 왜 "케이트"전에 "닉"하지 않았습니까? –

+0

woops, typo :) wil 편집. – drummer

답변

2

일반적으로 원하는 것은 단순한 알고리즘입니다. 시퀀스 일치라고하며, longest common subsequence problem입니다. 나는 그것을 계산하는 PHP 함수가 내장되어 있다고 생각하지 않는다. 일단 당신이 성냥이 있으면, 그 (것)들 사이 일치하지 않는 품목을 가공 할 수있다. 여러 개의 공통 부분 시퀀스가있을 수 있으므로이 유형의 병합을 원할 경우 항상 원래 배열과 동일한 순서로 모든 항목을 처리 할 수는 없습니다.

최상의 결과를 필요로하지 않는 경우, 당신은 탐욕 4 개 다음 항목 내에서 일치를 찾고이 같은 근사, 시도 할 수 :

$result = array(); 

$i = 0; 
$j = 0; 
while ($i < count($arr1)) { 
    // Look for a matching item in the next four items of $arr2 
    $k = 0; 
    while ($k < 4) { 
     // Do we have a match? 
     if ($arr1[$i] == $arr2[$j+$k]) { 
      // Add items from $arr2 that are before the matching item 
      while ($k-- > 0) { 
       $result[] = $arr2[$j]; 
       $j++; 
      } 
      $j++; 
      break; 
     } 
     $k++; 
    } 
    // Add the current item fro $arr1 
    $result[] = $arr1[$i]; 
    $i++; 
} 
// Add the remaining items from $arr2 
while ($j < count($arr2)) { 
    $result[] = $arr2[$j]; 
    $j++; 
} 

$result = array_unique($result); 
+0

몇 가지 이유로 내 편집/시도가 게시물에 표시되지 않습니다. 수정 된 새 콘텐츠가 표시되는 데 시간이 걸릴 수 있습니다. 그러나 당신이 말하는 것은 바로 루카스입니다. 드러머는 논리적으로 예상대로 래리 이후입니다. – drummer

+0

예,이 답변은 현재 버전을 기반으로합니다. 이전 주문의 경우 여전히 LCS를 받아야하지만 일치하지 않는 품목의 주문은 명확하지 않습니다. –

+0

나에게 그걸 갖다 줄 아이디어가 있니? 절대적으로 필요한 기능은 아니지만 갖고있는 것이 좋을 것입니다. 그래서 그것을 작동 시키려하지 않는 이유를 생각했습니다. 나는 내 경우에 LCS가 필요하지 않을 수도 있다고 생각한다. 두 번째 배열을 살펴보고 뭔가 고유한지 확인한 다음 일치하는 부분을 찾으십시오. – drummer