La fonction Array_udiff est utilisée pour calculer les différences entre plusieurs tableaux. La différence par rapport à Array_Diff est qu'il permet aux développeurs de fournir une fonction de comparaison personnalisée pour comparer les éléments. La syntaxe de base de cette fonction est la suivante:
<span><span><span class="hljs-title function_ invoke__">array_udiff</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">array</span></span><span> ...</span><span><span class="hljs-variable">$arrays</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">array</span></span><span>
</span></span>
$ array1, $ array2, ... $ arrays : un ou plusieurs tableaux à comparer.
$ value_compare_func : une fonction de rappel qui compare deux éléments de tableau. Cette fonction renvoie une valeur entière pour indiquer l'ordre des éléments.
La fonction d'une fonction de comparaison personnalisée est de définir les règles de comparaison entre les éléments du tableau. Il prend deux paramètres, généralement des éléments de deux tableaux, puis détermine leur commande en fonction du résultat retourné. La comparaison des fonctions doit suivre les règles suivantes:
Si le premier paramètre est plus petit que le deuxième paramètre, une valeur négative est renvoyée.
Si le premier paramètre est égal au deuxième paramètre, retournez zéro.
Si le premier paramètre est supérieur au deuxième paramètre, une valeur positive est renvoyée.
PHP déterminera quels éléments sont conservés dans le tableau de résultat en fonction de la valeur de retour de la fonction de comparaison personnalisée.
La mise en œuvre des fonctions de comparaison personnalisées est relativement simple. Voici un exemple de fonction de comparaison personnalisé de base:
<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">if</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-keyword">return</span></span><span> </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-comment">// égal</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-number">1</span></span><span> : </span><span><span class="hljs-number">1</span></span><span>; </span><span><span class="hljs-comment">// Moins que le retour négatif,Nombre positif supérieur à Retour</span></span><span>
}
</span></span>
Cette fonction de comparaison concerne les nombres, et si vous souhaitez comparer les chaînes ou les types de données plus complexes, vous devrez peut-être les modifier en fonction des besoins réels.
Dans Array_udiff , l'utilisation de fonctions de comparaison personnalisées est très simple. Il suffit de le passer comme le dernier paramètre. Par exemple, comparez les différences entre deux tableaux:
<span><span><span class="hljs-variable">$array1</span></span><span> = [</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">4</span></span><span>];
</span><span><span class="hljs-variable">$array2</span></span><span> = [</span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">4</span></span><span>, </span><span><span class="hljs-number">5</span></span><span>, </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_udiff</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-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>
(
[</span><span><span class="hljs-number">0</span></span><span>] => </span><span><span class="hljs-number">1</span></span><span>
[</span><span><span class="hljs-number">1</span></span><span>] => </span><span><span class="hljs-number">2</span></span><span>
)
</span></span>
Comme vous pouvez le voir, les éléments de différence des tableaux $ array1 et $ array2 sont 1 et 2 , et ils ne sont pas dans $ array2 .
Array_udiff peut non seulement comparer deux tableaux, mais également comparer les différences entre plusieurs tableaux. Il vous suffit de passer plus de tableaux et PHP comparera un par un dans l'ordre donné.
Par exemple, comparez les différences entre trois tableaux:
<span><span><span class="hljs-variable">$array1</span></span><span> = [</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">4</span></span><span>];
</span><span><span class="hljs-variable">$array2</span></span><span> = [</span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">5</span></span><span>];
</span><span><span class="hljs-variable">$array3</span></span><span> = [</span><span><span class="hljs-number">3</span></span><span>, </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_udiff</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-variable">$array3</span></span><span>, </span><span><span class="hljs-string">"compare_values"</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>
(
[</span><span><span class="hljs-number">0</span></span><span>] => </span><span><span class="hljs-number">1</span></span><span>
[</span><span><span class="hljs-number">3</span></span><span>] => </span><span><span class="hljs-number">4</span></span><span>
)
</span></span>
Si vous devez comparer les chaînes ou les structures de données complexes, la fonction de comparaison doit également être ajustée en conséquence. Par exemple, lorsque vous comparez la taille de deux chaînes, vous pouvez utiliser la fonction STRCMP :
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">compare_strings</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-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-variable">$array1</span></span><span> = [</span><span><span class="hljs-string">"apple"</span></span><span>, </span><span><span class="hljs-string">"banana"</span></span><span>, </span><span><span class="hljs-string">"cherry"</span></span><span>];
</span><span><span class="hljs-variable">$array2</span></span><span> = [</span><span><span class="hljs-string">"banana"</span></span><span>, </span><span><span class="hljs-string">"cherry"</span></span><span>, </span><span><span class="hljs-string">"date"</span></span><span>];
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_udiff</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_strings"</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>
(
[</span><span><span class="hljs-number">0</span></span><span>] => apple
)
</span></span>
En PHP, les fermetures (fonctions anonymes) sont également une utilisation courante et peuvent être utilisées comme fonctions de comparaison pour array_udiff . De cette façon, vous n'avez pas besoin de définir une fonction nommée séparément. Par exemple, le code suivant montre comment utiliser les fermetures pour comparer les différences entre deux tableaux entiers:
<span><span><span class="hljs-variable">$array1</span></span><span> = [</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">4</span></span><span>];
</span><span><span class="hljs-variable">$array2</span></span><span> = [</span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">5</span></span><span>];
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_udiff</span></span><span>(</span><span><span class="hljs-variable">$array1</span></span><span>, </span><span><span class="hljs-variable">$array2</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-variable">$a</span></span><span> - </span><span><span class="hljs-variable">$b</span></span><span>; </span><span><span class="hljs-comment">// Comparaison simple des tailles numériques</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>
(
[</span><span><span class="hljs-number">0</span></span><span>] => </span><span><span class="hljs-number">1</span></span><span>
[</span><span><span class="hljs-number">3</span></span><span>] => </span><span><span class="hljs-number">4</span></span><span>
)
</span></span>
Les performances de Array_udiff peuvent devenir un problème lorsqu'ils traitent avec de très grands tableaux. Étant donné que Array_udiff nécessite qu'une fonction de comparaison personnalisée soit appelée élément par élément, l'optimisation des performances devient particulièrement importante. Lors de l'écriture de fonctions de comparaison, essayez d'éviter les calculs inutiles et la logique complexe, et gardez les fonctions de comparaison concises et efficaces.
En utilisant Array_udiff et une fonction de comparaison personnalisée, nous pouvons calculer de manière flexible les différences entre plusieurs tableaux. La clé est de comprendre correctement le fonctionnement de la fonction de comparaison et d'ajuster les règles de comparaison en fonction des différents types de données. Qu'il s'agisse de nombres, de chaînes ou de structures de données complexes, les fonctions de comparaison personnalisées peuvent fournir aux développeurs un contrôle plus élevé. Espérons que, grâce à l'explication de cet article, vous pouvez mieux comprendre comment utiliser la fonction Array_udiff en PHP pour gérer les différences de tableau.