현재 위치: > 최신 기사 목록> UKSORT를 사용할 때 동일한 키의 재정렬을 피하는 방법

UKSORT를 사용할 때 동일한 키의 재정렬을 피하는 방법

gitbox 2025-05-31

1. Uksort () 함수 소개

uksort (배열 및 $ 배열, 호출 가능한 $ 콜백) : bool 함수는 배열의 키를 정렬합니다. $ Callback은 두 개의 키 이름을 매개 변수로 받아들이고, 값을 적은 값으로, 0보다 큰 값을 반환하며, 분류 순서를 결정하는 사용자 정의 비교 함수입니다.

샘플 코드 :

 $array = [
    'apple' => 1,
    'banana' => 2,
    'cherry' => 3,
];

uksort($array, function($a, $b) {
    return strcmp($a, $b);
});

print_r($array);

산출:

 Array
(
    [apple] => 1
    [banana] => 2
    [cherry] => 3
)

2. 문제 설명 : 동일한 키로 인한 반복 정렬

키가 어떤 종류의 전처리 또는 매핑을 겪으면 다른 원래 키가 "동일한 키"로 간주 될 수 있습니다. 이 시점에서 비교 함수는 빈번하고 반복적으로 호출되어 성능에 영향을 줄 수 있습니다. 예를 들어:

 $array = [
    'a_1' => 10,
    'a_2' => 20,
    'b_1' => 30,
];

uksort($array, function($key1, $key2) {
    // 밑줄 앞에 부분을 비교하십시오
    $part1 = explode('_', $key1)[0];
    $part2 = explode('_', $key2)[0];
    return strcmp($part1, $part2);
});

이 시점에서 'A_1''A_2' 는 "동일한 키"로 취급되며 비교 함수는 여러 번 비교할 수 있습니다. 큰 배열의 경우이 반복은 효율성을 크게 줄입니다.

3. 반복적 인 분류를 피하는 핵심 아이디어

반복적 인 분류를 피하기 위해 키는 비교 함수에서 동일한 "논리 키"의 반복 계산을 줄이고 동등한 키의 불필요한 비교를 피하는 것 입니다. 일반적인 관행은 다음과 같습니다.

  1. 캐시 매핑 결과 : 비교 함수는 내부적으로 정적 캐시를 사용하여 키 매핑 값의 반복 계산을 피합니다.

  2. 먼저 키의 전제 및 중복 제거 : 매핑 테이블을 작성하고 키를 분류 한 다음 정렬 할 때 매핑 결과와 직접 비교하십시오.

  3. 보조 배열 정렬 사용 : 맵핑 된 값을 보조 키로 사용하여 매핑 된 값 세트를 형성 한 다음 array_multisort () 또는 기타 정렬 함수를 사용하여 반복 통화를 피하십시오.

4. 특정 구현 예

솔루션 1 : 함수 내 캐시 맵 비교

 $array = [
    'a_1' => 10,
    'a_2' => 20,
    'b_1' => 30,
    'b_2' => 40,
    'c_1' => 50,
];

uksort($array, function($key1, $key2) {
    static $cache = [];

    if (!isset($cache[$key1])) {
        $cache[$key1] = explode('_', $key1)[0];
    }
    if (!isset($cache[$key2])) {
        $cache[$key2] = explode('_', $key2)[0];
    }

    return strcmp($cache[$key1], $cache[$key2]);
});

print_r($array);

이런 식으로, Exploit ( '_', $ key) 작업은 반복 계산을 피하고 성능을 향상시키지 않으면 한 번만 수행됩니다.

솔루션 2 : 매핑 키 전처리, 정렬 지원

 $array = [
    'a_1' => 10,
    'a_2' => 20,
    'b_1' => 30,
    'b_2' => 40,
    'c_1' => 50,
];

// 맵 키 배열을 생성합니다
$mappedKeys = [];
foreach (array_keys($array) as $key) {
    $mappedKeys[$key] = explode('_', $key)[0];
}

// 키를 매핑하여 키 이름을 정렬하십시오
uasort($mappedKeys, function($a, $b) {
    return strcmp($a, $b);
});

// 정렬 된 매핑 키에 따라 기본 배열을 재구성합니다.
$newArray = [];
foreach ($mappedKeys as $originalKey => $_) {
    $newArray[$originalKey] = $array[$originalKey];
}

print_r($newArray);

이 솔루션은 UKSORT 의 기능을 비교하기위한 여러 통화를 피하고 매핑 규칙이 복잡 할 때 사용하기에 적합합니다.


5. 요약

  • uksort ()를 사용할 때 비교 함수는 여러 번 호출됩니다. 특히 키를 동일하게 변환하거나 분류 해야하는 경우 반복 계산이 발생하기 쉬운 경우.

  • 비교 함수에서 캐시를 사용하거나 미리 매핑 키를 사용하면 반복적 인 정렬을 효과적으로 피하고 성능 및 코드 선명도를 향상시킬 수 있습니다.

  • 선택할 솔루션은 배열 크기, 매핑 규칙 복잡성 및 성능 요구 사항에 따라 다릅니다.

위의 기술을 마스터 한 후에는 uksort ()를 사용하여 복잡한 키를보다 유연하고 효율적으로 정렬 할 수 있습니다.