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
)
키가 어떤 종류의 전처리 또는 매핑을 겪으면 다른 원래 키가 "동일한 키"로 간주 될 수 있습니다. 이 시점에서 비교 함수는 빈번하고 반복적으로 호출되어 성능에 영향을 줄 수 있습니다. 예를 들어:
$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' 는 "동일한 키"로 취급되며 비교 함수는 여러 번 비교할 수 있습니다. 큰 배열의 경우이 반복은 효율성을 크게 줄입니다.
반복적 인 분류를 피하기 위해 키는 비교 함수에서 동일한 "논리 키"의 반복 계산을 줄이고 동등한 키의 불필요한 비교를 피하는 것 입니다. 일반적인 관행은 다음과 같습니다.
캐시 매핑 결과 : 비교 함수는 내부적으로 정적 캐시를 사용하여 키 매핑 값의 반복 계산을 피합니다.
먼저 키의 전제 및 중복 제거 : 매핑 테이블을 작성하고 키를 분류 한 다음 정렬 할 때 매핑 결과와 직접 비교하십시오.
보조 배열 정렬 사용 : 맵핑 된 값을 보조 키로 사용하여 매핑 된 값 세트를 형성 한 다음 array_multisort () 또는 기타 정렬 함수를 사용하여 반복 통화를 피하십시오.
$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) 작업은 반복 계산을 피하고 성능을 향상시키지 않으면 한 번만 수행됩니다.
$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 의 기능을 비교하기위한 여러 통화를 피하고 매핑 규칙이 복잡 할 때 사용하기에 적합합니다.
uksort ()를 사용할 때 비교 함수는 여러 번 호출됩니다. 특히 키를 동일하게 변환하거나 분류 해야하는 경우 반복 계산이 발생하기 쉬운 경우.
비교 함수에서 캐시를 사용하거나 미리 매핑 키를 사용하면 반복적 인 정렬을 효과적으로 피하고 성능 및 코드 선명도를 향상시킬 수 있습니다.
선택할 솔루션은 배열 크기, 매핑 규칙 복잡성 및 성능 요구 사항에 따라 다릅니다.
위의 기술을 마스터 한 후에는 uksort ()를 사용하여 복잡한 키를보다 유연하고 효율적으로 정렬 할 수 있습니다.