Position actuelle: Accueil> Derniers articles> Comment personnaliser la fonction de comparaison du nom de clé et l'appliquer à array_intersect_ukey? Partage des compétences

Comment personnaliser la fonction de comparaison du nom de clé et l'appliquer à array_intersect_ukey? Partage des compétences

gitbox 2025-06-24

Dans PHP, nous utilisons souvent diverses fonctions de tableau pour traiter les données, en particulier Array_INTERSECT_UKEY () , qui est utilisée pour comparer les noms de clés de deux tableaux ou plus et des éléments de retour avec les mêmes noms de clé entre eux. Cette fonction est très pratique à utiliser, mais si nous souhaitons utiliser une méthode de comparaison personnalisée pour déterminer si les noms de clés sont les mêmes, la fonction Array_INTERSECT_UKEY () deviendra quelque peu restreinte. Par conséquent, la maîtrise de la personnalisation de la fonction de comparaison du nom de clé et de l'appliquer à array_intersect_ukey () améliorera considérablement nos capacités de traitement de la table.

1. Utilisation de base de Array_INTERSECT_UKEY ()

Tout d'abord, il est très important de comprendre l'utilisation de base de array_intersect_ukey () . La syntaxe de cette fonction est la suivante:

 <span><span><span class="hljs-title function_ invoke__">array_intersect_ukey</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$array1</span></span><span>, </span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$array2</span></span><span>, </span><span><span class="hljs-keyword">callable</span></span><span> </span><span><span class="hljs-variable">$key_compare_func</span></span><span>): </span><span><span class="hljs-keyword">array</span></span><span>
</span></span>
  • $ array1 et $ array2 : deux tableaux à comparer.

  • $ key_compare_func : une fonction de rappel qui compare deux noms de clés. Si la valeur de retour est inférieure à 0, la première touche est plus petite que la deuxième touche; Si la valeur de retour est supérieure à 0, la première clé est supérieure à la deuxième clé; Si 0 est retourné, les deux clés sont égales.

Par exemple, le code suivant montre une utilisation commune de array_intersect_ukey () :

 <span><span><span class="hljs-variable">$array1</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> =&gt; </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span> =&gt; </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> =&gt; </span><span><span class="hljs-number">3</span></span><span>];
</span><span><span class="hljs-variable">$array2</span></span><span> = [</span><span><span class="hljs-string">'b'</span></span><span> =&gt; </span><span><span class="hljs-number">4</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> =&gt; </span><span><span class="hljs-number">5</span></span><span>, </span><span><span class="hljs-string">'d'</span></span><span> =&gt; </span><span><span class="hljs-number">6</span></span><span>];

</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_intersect_ukey</span></span><span>(</span><span><span class="hljs-variable">$array1</span></span><span>, </span><span><span class="hljs-variable">$array2</span></span><span>, </span><span><span class="hljs-string">'strcasecmp'</span></span><span>);

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

Le résultat de la sortie est:

 <span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
    [b] =&gt; </span><span><span class="hljs-number">2</span></span><span>
    [c] =&gt; </span><span><span class="hljs-number">3</span></span><span>
)
</span></span>

Dans cet exemple, StrcasecMP est utilisé comme une fonction de rappel, qui ignore la comparaison de cas des noms de clés et renvoie finalement des éléments avec les mêmes noms de clé dans les deux tableaux.

2. Fonction de comparaison de nom de clé personnalisé

Dans les applications pratiques, nous devons souvent concevoir une fonction de comparaison plus complexe selon nos besoins. PHP nous permet de passer dans une fonction de comparaison personnalisée, afin que nous puissions contrôler finement la logique de comparaison.

Par exemple, si nous souhaitons comparer les noms clés d'un tableau, en considérant non seulement le cas des lettres mais aussi la priorité des caractères spéciaux, nous pouvons personnaliser une fonction pour y parvenir:

 <span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">custom_key_compare</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$key1</span></span></span><span>, </span><span><span class="hljs-variable">$key2</span></span><span>) {
    </span><span><span class="hljs-comment">// Logique de comparaison personnalisée:Si le nom de clé contient des caractères spéciaux,Priorité plus élevée</span></span><span>
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">strpos</span></span><span>(</span><span><span class="hljs-variable">$key1</span></span><span>, </span><span><span class="hljs-string">'@'</span></span><span>) !== </span><span><span class="hljs-literal">false</span></span><span> &amp;&amp; </span><span><span class="hljs-title function_ invoke__">strpos</span></span><span>(</span><span><span class="hljs-variable">$key2</span></span><span>, </span><span><span class="hljs-string">'@'</span></span><span>) === </span><span><span class="hljs-literal">false</span></span><span>) {
        </span><span><span class="hljs-keyword">return</span></span><span> -</span><span><span class="hljs-number">1</span></span><span>;  </span><span><span class="hljs-comment">// $key1 priorité</span></span><span>
    } </span><span><span class="hljs-keyword">elseif</span></span><span> (</span><span><span class="hljs-title function_ invoke__">strpos</span></span><span>(</span><span><span class="hljs-variable">$key2</span></span><span>, </span><span><span class="hljs-string">'@'</span></span><span>) !== </span><span><span class="hljs-literal">false</span></span><span> &amp;&amp; </span><span><span class="hljs-title function_ invoke__">strpos</span></span><span>(</span><span><span class="hljs-variable">$key1</span></span><span>, </span><span><span class="hljs-string">'@'</span></span><span>) === </span><span><span class="hljs-literal">false</span></span><span>) {
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-number">1</span></span><span>;   </span><span><span class="hljs-comment">// $key2 priorité</span></span><span>
    }
    
    </span><span><span class="hljs-comment">// Par défaut, comparez dans l&#39;ordre alphabétique</span></span><span>
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">strcmp</span></span><span>(</span><span><span class="hljs-variable">$key1</span></span><span>, </span><span><span class="hljs-variable">$key2</span></span><span>);
}
</span></span>

Dans cet exemple, la fonction CUSTAUX_KEY_COMPARE () détermine d'abord si le nom de clé contient le symbole @ . Si l'un contient et l'autre ne le fait pas, le nom de clé contenant @ prend la priorité. Sinon, il sera comparé alphabétique.

3. Appliquer une fonction de comparaison personnalisée à array_intersect_ukey ()

Ensuite, nous pouvons appliquer la fonction personnalisée_key_compare () à array_intersect_ukey () pour effectuer la comparaison du nom de clé. Supposons que nous ayons les deux tableaux suivants:

 <span><span><span class="hljs-variable">$array1</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> =&gt; </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'b@'</span></span><span> =&gt; </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> =&gt; </span><span><span class="hljs-number">3</span></span><span>];
</span><span><span class="hljs-variable">$array2</span></span><span> = [</span><span><span class="hljs-string">'b'</span></span><span> =&gt; </span><span><span class="hljs-number">4</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> =&gt; </span><span><span class="hljs-number">5</span></span><span>, </span><span><span class="hljs-string">'d'</span></span><span> =&gt; </span><span><span class="hljs-number">6</span></span><span>, </span><span><span class="hljs-string">'b@'</span></span><span> =&gt; </span><span><span class="hljs-number">7</span></span><span>];

</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_intersect_ukey</span></span><span>(</span><span><span class="hljs-variable">$array1</span></span><span>, </span><span><span class="hljs-variable">$array2</span></span><span>, </span><span><span class="hljs-string">'custom_key_compare'</span></span><span>);

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

Le résultat de la sortie est:

 <span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
    [b@] =&gt; </span><span><span class="hljs-number">2</span></span><span>
)
</span></span>

Comme vous pouvez le voir, Array_INTERSECT_UKEY () reconnaît avec succès le nom de clé B @ Selon notre fonction de comparaison de nom de clé personnalisée, tout en ignorant B , même s'ils ont la même valeur dans le tableau.

4. Application pratique

En personnalisant la fonction de comparaison du nom de clé, nous pouvons gérer de manière flexible de nombreux scénarios complexes. Par exemple, si nous voulons ignorer le cas lorsque nous travaillons sur des chemins de fichier, ou unifiez les instructions de slash (Slash / et arrière-boucles ) dans un format dans un format, array_intersect_ukey () peut également être facilement comparé en fonction des règles personnalisées.

Supposons que nous ayons le tableau de chemin de fichier suivant:

 <span><span><span class="hljs-variable">$array1</span></span><span> = [</span><span><span class="hljs-string">'src/main.php'</span></span><span> =&gt; </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'src/config/config.php'</span></span><span> =&gt; </span><span><span class="hljs-number">2</span></span><span>];
</span><span><span class="hljs-variable">$array2</span></span><span> = [</span><span><span class="hljs-string">'SRC/main.php'</span></span><span> =&gt; </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">'src/config/config.php'</span></span><span> =&gt; </span><span><span class="hljs-number">4</span></span><span>];
</span></span>

Nous voulons ignorer le boîtier et unifier la direction de la barre oblique dans le chemin. Nous pouvons personnaliser la fonction de comparaison comme suit:

 <span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">path_compare</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$key1</span></span></span><span>, </span><span><span class="hljs-variable">$key2</span></span><span>) {
    </span><span><span class="hljs-comment">// Convertir les chemins en baisses en avant et ignorer le boîtier</span></span><span>
    </span><span><span class="hljs-variable">$key1</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_replace</span></span><span>(</span><span><span class="hljs-string">'\\'</span></span><span>, </span><span><span class="hljs-string">'/'</span></span><span>, </span><span><span class="hljs-title function_ invoke__">strtolower</span></span><span>(</span><span><span class="hljs-variable">$key1</span></span><span>));
    </span><span><span class="hljs-variable">$key2</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_replace</span></span><span>(</span><span><span class="hljs-string">'\\'</span></span><span>, </span><span><span class="hljs-string">'/'</span></span><span>, </span><span><span class="hljs-title function_ invoke__">strtolower</span></span><span>(</span><span><span class="hljs-variable">$key2</span></span><span>));
    
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">strcmp</span></span><span>(</span><span><span class="hljs-variable">$key1</span></span><span>, </span><span><span class="hljs-variable">$key2</span></span><span>);
}

</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_intersect_ukey</span></span><span>(</span><span><span class="hljs-variable">$array1</span></span><span>, </span><span><span class="hljs-variable">$array2</span></span><span>, </span><span><span class="hljs-string">'path_compare'</span></span><span>);

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

Le résultat de la sortie est:

 <span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
    [src/config/config.php] =&gt; </span><span><span class="hljs-number">2</span></span><span>
)
</span></span>

Grâce à des fonctions de comparaison personnalisées, nous avons ignoré avec succès la différence dans le cas de chemin et la direction de la barre oblique et obtenons le résultat correct.

5. Résumé

Grâce à la fonction Array_INTERSECT_UKEY () combinée avec la fonction de comparaison de nom de clé personnalisé, PHP fournit un moyen flexible et efficace de gérer la comparaison des noms de clés dans un tableau. Qu'il s'agisse d'une comparaison alphabétique simple ou d'un jugement de règles spéciales complexes, il peut être réalisé grâce à des fonctions de comparaison personnalisées. Cela nous fournit des outils puissants lors du traitement des données complexes, ce qui peut nous aider à contrôler plus précisément le comportement des opérations de tableau.