Dans PHP, array_udiff_uassoc () est une fonction pour comparer deux tableaux ou plus. Il peut utiliser des fonctions de comparaison définies par l'utilisateur pour calculer les différences de tableau et permet des comparaisons en fonction des clés et des valeurs en même temps. Bien qu'il s'agisse d'un outil puissant, array_udiff_uassoc () peut ne pas fonctionner de manière satisfaisante lorsqu'il s'agit de grandes quantités de données. Cet article explorera comment optimiser les performances de cette fonction pour améliorer l'efficacité d'exécution du code.
La syntaxe de base de la fonction array_udiff_uassoc () est la suivante:
<span><span><span class="hljs-title function_ invoke__">array_udiff_uassoc</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">$value_compare_func</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 sont deux tableaux à comparer.
$ value_compare_func est une fonction de rappel utilisée pour comparer les valeurs des éléments de tableau.
$ key_compare_func est une fonction de rappel utilisée pour comparer les clés du tableau.
La fonction renvoie un tableau contenant des éléments qui existent dans $ array1 mais pas dans $ array2 , et les valeurs de clé et d'élément sont comparées aux fonctions de rappel personnalisées.
array_udiff_uassoc () peut rencontrer les goulots d'étranglement de performance suivants:
Fonction de rappel surcharge : les fonctions de rappel définies par l'utilisateur sont appelées chaque fois qu'un élément est comparé, ce qui peut entraîner une dégradation significative des performances pour de grandes quantités de données.
Traversement multiple du tableau : Cette fonction nécessite plusieurs traversées de tableau: une fois pour la comparaison de valeur, une fois pour la comparaison des clés, plus les frais généraux tels que les opérations internes PHP et l'allocation de mémoire.
Consommation de mémoire : cela consomme de la mémoire supplémentaire car un nouveau tableau doit être généré pour enregistrer les résultats, en particulier lorsque le tableau d'entrée est très important.
Afin d'améliorer les performances de la fonction array_udiff_uassoc () , les stratégies d'optimisation suivantes peuvent être prises en compte:
Les fonctions comparatives sont l'une des principales sources d'étranglements de performance. Si la logique interne de la fonction de rappel est complexe ou fréquemment appelée, elle peut entraîner une dégradation des performances. Par conséquent, assurez-vous que la mise en œuvre de la fonction de comparaison est aussi concise et efficace que possible.
Par exemple, supposons que vous ne deviez faire qu'une comparaison en entier simple, vous pouvez éviter les opérations de chaîne trop complexes ou les jugements conditionnels multiples:
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">compare_values</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$a</span></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-variable">$a</span></span><span> - </span><span><span class="hljs-variable">$b</span></span><span>; </span><span><span class="hljs-comment">// Comparaison simple entier</span></span><span>
}
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">compare_keys</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$a</span></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-variable">$a</span></span><span> - </span><span><span class="hljs-variable">$b</span></span><span>; </span><span><span class="hljs-comment">// Comparaison de clés simples</span></span><span>
}
</span></span>
Étant donné que Array_UDIFF_UASSOC () nécessite plusieurs traversées sur le tableau d'entrée, le nombre de traversées peut être réduit en fusionnant plusieurs opérations. Par exemple, un calcul de différence simple peut être effectué d'abord par PHP Array_Diff () ou Array_Diff_assoc () , puis une comparaison de valeurs de clé plus complexe ne peut être effectuée que sur la partie de différence.
<span><span><span class="hljs-comment">// Obtenez d'abord la différence dans la valeur</span></span><span>
</span><span><span class="hljs-variable">$diff</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_diff</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-comment">// Puis comparez les clés de la partie de différence</span></span><span>
</span><span><span class="hljs-variable">$final_result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_udiff_uassoc</span></span><span>(</span><span><span class="hljs-variable">$diff</span></span><span>, </span><span><span class="hljs-variable">$array2</span></span><span>, </span><span><span class="hljs-string">'compare_values'</span></span><span>, </span><span><span class="hljs-string">'compare_keys'</span></span><span>);
</span></span>
Cette approche peut réduire considérablement la traversée inutile du tableau, en particulier lors de la comparaison de grands tableaux.
Dans certains cas, si les données comparées ne changent pas fréquemment, des techniques de mise en cache peuvent être prises en compte. Par exemple, stockez les résultats de comparaison dans le cache et obtenez les résultats directement du cache de l'appel suivant, plutôt que de recalculer la différence.
<span><span><span class="hljs-comment">// Utilisez du cache pour stocker les résultats de comparaison</span></span><span>
</span><span><span class="hljs-variable">$cache_key</span></span><span> = </span><span><span class="hljs-title function_ invoke__">md5</span></span><span>(</span><span><span class="hljs-title function_ invoke__">serialize</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-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$cached_result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">get_from_cache</span></span><span>(</span><span><span class="hljs-variable">$cache_key</span></span><span>)) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$cached_result</span></span><span>;
}
</span><span><span class="hljs-comment">// Si le cache ne frappe pas,Ensuite, effectuez des calculs et stockez les résultats</span></span><span>
</span><span><span class="hljs-variable">$diff_result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_udiff_uassoc</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">'compare_values'</span></span><span>, </span><span><span class="hljs-string">'compare_keys'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">store_in_cache</span></span><span>(</span><span><span class="hljs-variable">$cache_key</span></span><span>, </span><span><span class="hljs-variable">$diff_result</span></span><span>);
</span></span>
Pour les très grands ensembles de données, la gestion de la mémoire par défaut PHP peut provoquer des goulots d'étranglement de performances. Pour optimiser l'utilisation de la mémoire, vous pouvez essayer d'utiliser des générateurs dans les opérations du tableau pour réduire l'utilisation de la mémoire.
En traitant progressivement les différences de tableaux par le générateur, au lieu de charger toutes les données dans la mémoire à la fois, il peut réduire efficacement la consommation de mémoire.
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">generator_diff</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-keyword">array</span></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">foreach</span></span><span> (</span><span><span class="hljs-variable">$array1</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> => </span><span><span class="hljs-variable">$value</span></span><span>) {
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">in_array</span></span><span>(</span><span><span class="hljs-variable">$value</span></span><span>, </span><span><span class="hljs-variable">$array2</span></span><span>)) {
</span><span><span class="hljs-keyword">yield</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> => </span><span><span class="hljs-variable">$value</span></span><span>;
}
}
}
</span><span><span class="hljs-variable">$diff</span></span><span> = </span><span><span class="hljs-title function_ invoke__">generator_diff</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>
Dans certains cas, il peut ne pas être nécessaire d'utiliser array_udiff_uassoc () . PHP fournit une variété de fonctions de comparaison de tables différentes, telles que array_diff () , array_diff_assoc () , array_intersect () , etc. Ces fonctions sont généralement meilleures que Array_udiff_uassoc () dans les performances car elles optimisent de nombreuses opérations communes en interne. Si seule une comparaison de valeurs de clé simple est nécessaire, le choix de la bonne fonction peut réduire la quantité de calcul.
Grâce à la méthode d'optimisation ci-dessus, nous pouvons améliorer considérablement les performances de la fonction array_udiff_uassoc () sous de grands volumes de données. L'accent est mis sur la rationalisation de la mise en œuvre des fonctions de rappel, la réduction de la traversée de réseau inutile, la mise en cache de résultats communs, l'optimisation de l'utilisation de la mémoire et la sélection raisonnablement de différentes fonctions de tableau en fonction des besoins réels. Ces mesures peuvent aider les développeurs à améliorer l'efficacité et l'évolutivité du code lorsqu'ils traitent des comparaisons complexes de tableau.
Étiquettes associées:
array_udiff_uassoc