Position actuelle: Accueil> Derniers articles> Comment empêcher la fonction Natsort de modifier la valeur de clé d'origine d'un tableau lors du tri?

Comment empêcher la fonction Natsort de modifier la valeur de clé d'origine d'un tableau lors du tri?

gitbox 2025-08-30

Dans PHP, la fonction Natsort est une méthode de tri couramment utilisée qui trie les éléments dans un tableau dans "Ordre naturel". Cette méthode de tri peut être plus conforme aux habitudes de lecture humaines, telles que le nombre "10" sera classé avant "2", plutôt que l'ordre traditionnel des codes ASCII. Mais lors du tri avec Natsort , vous pouvez rencontrer un problème - il réinitialise la valeur clé du tableau, ce qui entraîne la perte de la valeur de clé d'origine. Cela peut rendre difficile l'accès aux données en fonction de la valeur de clé d'origine dans les opérations suivantes.

Cet article discutera de la façon d'éviter que Natsort change la valeur clé d'origine d'un tableau et introduira quelques conseils et alternatives connexes.

Natsort et son impact

La fonction de la fonction Natsort est de trier les tableaux basés sur "l'ordre naturel". Le tri d'ordre soi-disant naturel fait référence à des nombres de tri par leur taille lors du tri, plutôt que de les trier dans l'ordre des cordes du dictionnaire. Par exemple:

 <span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-string">'a10'</span></span><span>, </span><span><span class="hljs-string">'a2'</span></span><span>, </span><span><span class="hljs-string">'a1'</span></span><span>, </span><span><span class="hljs-string">'a20'</span></span><span>];
</span><span><span class="hljs-title function_ invoke__">natsort</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);
</span></span>

Après avoir exécuté le code ci-dessus, le résultat de sortie est le suivant:

 <span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
    [</span><span><span class="hljs-number">2</span></span><span>] =&gt; a1
    [</span><span><span class="hljs-number">1</span></span><span>] =&gt; a2
    [</span><span><span class="hljs-number">0</span></span><span>] =&gt; a10
    [</span><span><span class="hljs-number">3</span></span><span>] =&gt; a20
)
</span></span>

Comme vous pouvez le voir, Natsort trie le tableau par la taille du nombre, mais il réinitialise la valeur clé du tableau afin que les clés d'origine liées à l'élément ne soient plus conservées.

Comment éviter la perte de valeur clé

Si vous souhaitez conserver la valeur de clé d'origine lorsque vous utilisez Natsort , vous pouvez enregistrer la valeur de clé du tableau d'origine avant de trier, puis reconstruire le tableau trié. Cela garantit que le processus de tri n'affecte pas la valeur de clé d'origine.

Méthode 1: Utilisez Array_values ​​et Natsort

Vous pouvez trier en extrayant les valeurs du tableau, laissant la valeur clé inchangée. Ceci est réalisé via la fonction Array_Values . La méthode spécifique consiste à garder la valeur de clé d'origine d'abord, puis à trier:

 <span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> =&gt; </span><span><span class="hljs-string">'a10'</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span> =&gt; </span><span><span class="hljs-string">'a2'</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> =&gt; </span><span><span class="hljs-string">'a1'</span></span><span>, </span><span><span class="hljs-string">'d'</span></span><span> =&gt; </span><span><span class="hljs-string">'a20'</span></span><span>];

</span><span><span class="hljs-comment">// Enregistrer la valeur de clé d&#39;origine</span></span><span>
</span><span><span class="hljs-variable">$original_keys</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_keys</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);

</span><span><span class="hljs-comment">// Trier naturellement les valeurs</span></span><span>
</span><span><span class="hljs-title function_ invoke__">natsort</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);

</span><span><span class="hljs-comment">// Restaurer la valeur de clé d&#39;origine</span></span><span>
</span><span><span class="hljs-variable">$array</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_combine</span></span><span>(</span><span><span class="hljs-variable">$original_keys</span></span><span>, </span><span><span class="hljs-variable">$array</span></span><span>);

</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);
</span></span>

Résultat de sortie:

 <span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
    [a] =&gt; a1
    [b] =&gt; a2
    [c] =&gt; a10
    [d] =&gt; a20
)
</span></span>

Dans cette approche, la valeur de clé d'origine est d'abord obtenue par Array_Keys , puis le tableau est trié à l'aide de Natsort . Une fois le tri terminé, utilisez Array_Combine pour restaurer la correspondance entre la valeur clé et la valeur triée.

Méthode 2: Utilisez Uasort pour personnaliser le tri

Une autre façon consiste à utiliser la fonction Uasort pour le tri personnalisé. Semblable à Natsort , Uasort peut trier les tableaux, mais il ne modifie pas la valeur clé. En implémentant une fonction de tri personnalisée, vous pouvez contrôler la méthode de tri tout en conservant la valeur de clé d'origine:

 <span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> =&gt; </span><span><span class="hljs-string">'a10'</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span> =&gt; </span><span><span class="hljs-string">'a2'</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> =&gt; </span><span><span class="hljs-string">'a1'</span></span><span>, </span><span><span class="hljs-string">'d'</span></span><span> =&gt; </span><span><span class="hljs-string">'a20'</span></span><span>];

</span><span><span class="hljs-title function_ invoke__">uasort</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>, function(</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>) {
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">strnatcmp</span></span><span>(</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>);
});

</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);
</span></span>

UaSort implémente le tri via une fonction de rappel, qui utilise la fonction StrnatCMP en interne pour simuler la méthode de tri de l'ordre naturel sans modifier la valeur clé du tableau.

Résultat de sortie:

 <span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
    [c] =&gt; a1
    [b] =&gt; a2
    [a] =&gt; a10
    [d] =&gt; a20
)
</span></span>

Résumer

Bien que Natsort soit une fonction de tri puissante, il réinitialise la valeur clé du tableau. Si vous devez préserver les valeurs clés pendant le processus de tri, vous pouvez utiliser l'une des deux méthodes:

  1. Enregistrez d'abord la valeur de clé d'origine, puis restaurez la valeur de clé via array_combine après tri.

  2. Utilisez la fonction Uasort pour le tri personnalisé pour éviter la perte de valeur clé.

Avec ces deux méthodes, vous pouvez vous assurer que le tableau peut toujours maintenir la valeur de clé d'origine inchangée après avoir été triée naturellement, en évitant la perte de données pendant le processus de tri.