Position actuelle: Accueil> Derniers articles> Comment combiner array_diff_ukey et array_map pour implémenter une comparaison complexe de clés de tableau en php

Comment combiner array_diff_ukey et array_map pour implémenter une comparaison complexe de clés de tableau en php

gitbox 2025-09-08

<span><span><span class="hljs-meta"><?php</span></span><span> </span><span><span class="hljs-comment">// 本文将探讨在 PHP 中如何结合 array_diff_ukey 和 array_map 来实现更复杂的数组键比较场景。</span></span><span> </span><span><span class="hljs-comment">// array_diff_ukey 提供了自定义键比较的能力,而 array_map 则可以帮助我们对数据进行预处理,</span></span><span> </span><span><span class="hljs-comment">// 两者结合能够解决一些仅靠单一函数无法处理的问题。</span></span><span> </span><span><span class="hljs-comment">// --------------------------------------------</span></span><span> 在 PHP 的数组操作中,常见的函数如 `array_diff`、`array_diff_assoc`、`array_diff_key` 都提供了 对数组值或键的差集比较功能。然而,当我们需要在 **键的比较逻辑上引入自定义规则** 时, `array_diff_ukey` 就显得非常有用。它允许开发者传入一个用户自定义的回调函数,来决定两个键 在比较时的先后关系。 例如,假设我们有两个数组: ```php </span><span><span class="hljs-variable">$array1</span></span><span> = [ </span><span><span class="hljs-string">"User_01"</span></span><span> => </span><span><span class="hljs-string">"Alice"</span></span><span>, </span><span><span class="hljs-string">"User_02"</span></span><span> => </span><span><span class="hljs-string">"Bob"</span></span><span>, </span><span><span class="hljs-string">"User_03"</span></span><span> => </span><span><span class="hljs-string">"Charlie"</span></span><span> ]; </span><span><span class="hljs-variable">$array2</span></span><span> = [ </span><span><span class="hljs-string">"user_1"</span></span><span> => </span><span><span class="hljs-string">"Alice"</span></span><span>, </span><span><span class="hljs-string">"user_4"</span></span><span> => </span><span><span class="hljs-string">"David"</span></span><span> ]; </span></span>

Par défaut, Array_Diff_ukey ne reconnaît pas les similitudes entre "user_01" et "user_1" .
Si la logique métier nous oblige à comparer, nous devons combiner
array_map pour le prétraitement.

Utilisez Array_Map pour la normalisation des clés

Nous pouvons utiliser Array_map et Array_Keys pour effectuer un processus de "standardisation" sur les touches de tableau, les convertir en format unifié, puis comparer:

 <span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">normalizeKey</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$key</span></span></span><span>) {
    </span><span><span class="hljs-comment">// Retirez le soulignement et tournez en minuscules</span></span><span>
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">strtolower</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-variable">$key</span></span><span>));
}

</span><span><span class="hljs-variable">$normalized1</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_combine</span></span><span>(
    </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(</span><span><span class="hljs-string">"normalizeKey"</span></span><span>, </span><span><span class="hljs-title function_ invoke__">array_keys</span></span><span>(</span><span><span class="hljs-variable">$array1</span></span><span>)),
    </span><span><span class="hljs-title function_ invoke__">array_values</span></span><span>(</span><span><span class="hljs-variable">$array1</span></span><span>)
);

</span><span><span class="hljs-variable">$normalized2</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_combine</span></span><span>(
    </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(</span><span><span class="hljs-string">"normalizeKey"</span></span><span>, </span><span><span class="hljs-title function_ invoke__">array_keys</span></span><span>(</span><span><span class="hljs-variable">$array2</span></span><span>)),
    </span><span><span class="hljs-title function_ invoke__">array_values</span></span><span>(</span><span><span class="hljs-variable">$array2</span></span><span>)
);
</span></span>

À l'heure actuelle, les clés de $ Normalized1 et $ normalisé2 ont été uniformément converties en "minuscules sans soulignement".

Combiner array_diff_ukey pour obtenir une comparaison complexe

Ensuite, nous pouvons utiliser array_diff_ukey pour comparer:

 <span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_diff_ukey</span></span><span>(</span><span><span class="hljs-variable">$normalized1</span></span><span>, </span><span><span class="hljs-variable">$normalized2</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__">strcmp</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">$result</span></span><span>);
</span></span>

Le résultat de la sortie est:

 <span><span>Array
(
    [</span><span><span class="hljs-meta">user02</span></span><span>] =&gt; Bob
    [</span><span><span class="hljs-meta">user03</span></span><span>] =&gt; Charlie
)
</span></span>

Comme on peut le voir, user_01 et user_1 sont reconnus comme les mêmes clés, excluant ainsi le résultat de la différence.

Résumer

En combinant la normalisation des clés de Array_Map et la comparaison des clés personnalisées de Array_Diff_ukey ,
Nous sommes en mesure de gérer la logique de correspondance des clés plus complexe, tel que l'ignorance de cas, la suppression des caractères spécifiques et même la mise en œuvre de la correspondance partielle.
Cette approche est particulièrement utile lors de la gestion des sources de données externes (telles que les valeurs de retour de l'API, les données de téléchargement des utilisateurs), car les clés de ces données ne sont souvent pas toujours dans un format unifié.

Cette idée de combinaison de fonctions flexible peut non seulement améliorer la maintenabilité du code, mais également nous aider à nous adapter rapidement aux structures de données modifiables.

 <span></span>