Position actuelle: Accueil> Derniers articles> Comment éviter de réorganiser les mêmes clés lors de l'utilisation d'Uksort

Comment éviter de réorganiser les mêmes clés lors de l'utilisation d'Uksort

gitbox 2025-05-31

1. Introduction à la fonction uksort ()

uksort (array & $ array, callable $ callback): la fonction bool trie les clés d'un tableau. $ callback est une fonction de comparaison définie par l'utilisateur qui accepte deux noms de clés comme paramètres, renvoie les valeurs inférieures, égales ou supérieures à zéro et détermine l'ordre de tri.

Exemple de code:

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

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

print_r($array);

Sortir:

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

2. DESCRIPTION DU PROBLÈME: Tri répété causé par la même clé

Lorsque la clé a subi une sorte de prétraitement ou de cartographie, différentes clés d'origine peuvent être considérées comme des «mêmes clés». À l'heure actuelle, la fonction de comparaison peut être appelée fréquemment et à plusieurs reprises affectant les performances. Par exemple:

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

uksort($array, function($key1, $key2) {
    // Comparez uniquement la pièce avant le soulignement
    $part1 = explode('_', $key1)[0];
    $part2 = explode('_', $key2)[0];
    return strcmp($part1, $part2);
});

À ce stade, «A_1» et «A_2» sont traités comme des «mêmes clés», et la fonction de comparaison peut les comparer plusieurs fois. Pour les grandes tableaux, cette répétition réduit considérablement l'efficacité.

3. L'idée principale d'éviter le tri répété

Pour éviter le tri répété, la clé est de réduire les calculs répétés des mêmes «clés logiques» dans la fonction de comparaison , et d'éviter même des comparaisons inutiles de clés équivalentes . Les pratiques courantes sont:

  1. Résultats de la cartographie du cache : La fonction de comparaison utilise le cache statique en interne pour éviter le calcul répété des valeurs de mappage des clés.

  2. Tout d'abord, prétraitement et déduplication des clés : créez une table de mappage, classez les clés et comparez-les directement avec les résultats de cartographie lors du tri.

  3. Utilisez le tri du tableau auxiliaire : utilisez des valeurs mappées comme touches auxiliaires pour former un ensemble de valeurs mappées, puis utilisez array_multisort () ou d'autres fonctions de tri pour éviter les appels répétés.

4. Exemples de mise en œuvre spécifiques

Solution 1: Comparaison des cartes de cache dans les fonctions

 $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);

De cette façon, l'opération Exploit ('_', $ key) n'est effectuée qu'une seule fois, en évitant les calculs répétés et en améliorant les performances.

Solution 2: Clés de cartographie du prétraitement, aidant le tri

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

// Générer un tableau de clés de carte
$mappedKeys = [];
foreach (array_keys($array) as $key) {
    $mappedKeys[$key] = explode('_', $key)[0];
}

// Trier les noms de clés en mappant la clé
uasort($mappedKeys, function($a, $b) {
    return strcmp($a, $b);
});

// Reconstruire le tableau principal en fonction de la clé de mappage triée
$newArray = [];
foreach ($mappedKeys as $originalKey => $_) {
    $newArray[$originalKey] = $array[$originalKey];
}

print_r($newArray);

Cette solution évite plusieurs appels pour comparer les fonctions dans Uksort et convient pour une utilisation lorsque les règles de cartographie sont complexes.


5. Résumé

  • Lorsque vous utilisez Uksort () , la fonction de comparaison sera appelée plusieurs fois, en particulier lorsque les clés doivent être converties ou classées également, ce qui est sujet aux calculs répétés.

  • En utilisant des caches dans les fonctions de comparaison, ou à l'avance des clés de cartographie, le tri répété peut être évité efficacement et les performances et la clarté du code peuvent être améliorées.

  • Quelle solution à choisir dépend de la taille du tableau, de la complexité des règles de cartographie et des exigences de performance.

Après avoir maîtrisé les compétences ci-dessus, vous pouvez utiliser uksort () pour trier les clés complexes de manière plus flexible et efficace.