1

다음 코드를 최적화하는 데 유용한 아이디어가 있는지 궁금합니다.다차원 배열의 재정렬 및 ​​중복 제거 최적화

Array 
(
    [0] => Array 
    (
     [id] => 1 
     [title] => A good read 
     [priority] => 10 
    ) 

    [1] => Array 
    (
     [id] => 2 
     [title] => A bad read 
     [priority] => 20 

    ) 

    [2] => Array 
    (
     [id] => 3 
     [title] => A good read 
     [priority] => 10 
    ) 
) 

우선은 같은 제목 (다른 값이 무엇인지 상관없이) 공유하는 항목으로는 다음 제거 해요 : :

$List_new = array(); 
foreach ($List as $val) { 
    $List_new[$val['title']] = $val;  
} 
$List = array_values($List_new); 
다음과 같이 나는 다차원 배열 ($ 목록)가

Perfect. 그럼 먼저 우선 순위 필드 다음 ID로, 배열을 재정렬하고 있습니다 :

$sort_id = array(); 
$sort_priority = array(); 
foreach ($List as $key => $row) { 
    $sort_id[$key] = $row['id']; 
    $sort_priority[$key] = $row['priority']; 
} 
array_multisort($sort_priority, SORT_DESC, $sort_id, SORT_DESC, $List); 

두 코드 블록은 루프에 표시 $ sort_id 및 순서 변경하기 전에 $ sort_priority의 따라서 청소를.

중복 된 제목 항목을 제거하기 위해 정렬 프로세스를 사용하는 더 좋은 방법이 있습니까? 이 코드 블록은 최대 500,000 개의 레코드 루프에서 실행되므로 모든 개선 사항을 환영합니다!

답변

1

하나의 루프이지만 몇 가지 추가 함수 호출이 있으므로 Big O가 어떻게 변경되는지 말할 수는 없습니다. 한 가지주의해야 할 점은 숫자 주변의 패딩은 오버플로를 방지 할만큼 충분히 커야합니다. 즉 2 = 최대 99 개의 우선 순위 및 6 = 최대 999,999 개의 항목입니다.

$list_titles = array(); 
foreach($List as $val) { 
    if(isset($list_titles[$val['title']])) continue; 
    $list_titles[$val['title']] = true; 
    $List_new[str_pad($val['priority'], 2, 0, STR_PAD_LEFT).str_pad($val['id'], 6, 0, STR_PAD_LEFT)] = $val; 
} 
krsort($List_new); 

편집 : 약간의 수정을가했습니다.