Dans PHP, array_diff_ukey () est une fonction pour comparer les différences de noms de clés de deux tableaux ou plus, ce qui nous permet de personnaliser la logique de comparaison des noms de clés. De nombreux développeurs seront curieux:
Cet article explorera les réponses à cette question par l'analyse des principes et la mesure du code.
La documentation officielle est définie comme suit:
array_diff_ukey(array $array1, array $array2, callable $key_compare_func): array
Cette fonction renverra des éléments dans Array1 dont le nom de clé existe mais qui ne sont pas dans d'autres tableaux. La comparaison du nom de clé utilise votre fonction de rappel personnalisée.
Le point est: il ne compare que les clés, ne compare pas les valeurs , et il n'y a aucune explication interne qu'elle triera ou optimisera le tableau .
Nous disons souvent que le tri est propice à l'amélioration des performances de recherche, comme l'utilisation de la recherche binaire, etc. Cependant, array_diff_ukey () est basé sur votre fonction de comparaison personnalisée pour comparer les noms de clés un par un. Son implémentation est plus encline à la "comparaison des éléments par éléments" et ne profite pas de l'ordre des noms de clés.
Cela signifie:
Trier à l'avance n'a aucun effet sur les résultats ;
Dans la plupart des cas, les performances ne seront pas améliorées . Au lieu de cela, il existe un processus de tri supplémentaire, qui peut légèrement réduire l'efficacité globale.
Mais utilisons un morceau de code pour le tester.
<?php
function compare_keys($a, $b) {
return $a <=> $b;
}
// Générer deux tableaux,Inclure10000Éléments
$array1 = [];
$array2 = [];
for ($i = 0; $i < 10000; $i++) {
$key = "key" . rand(1, 20000);
$array1[$key] = "value1";
$array2[$key] = "value2";
}
// Cloner un tableau non trié
$unsorted1 = $array1;
$unsorted2 = $array2;
// Trier le tableau
$sorted1 = $array1;
$sorted2 = $array2;
ksort($sorted1);
ksort($sorted2);
// Tester les versions non triées
$start1 = microtime(true);
$result1 = array_diff_ukey($unsorted1, $unsorted2, 'compare_keys');
$time1 = microtime(true) - $start1;
// Test des versions triées
$start2 = microtime(true);
$result2 = array_diff_ukey($sorted1, $sorted2, 'compare_keys');
$time2 = microtime(true) - $start2;
echo "Temps d'exécution non trié: {$time1} Deuxième\n";
echo "Trier le temps d'exécution: {$time2} Deuxième\n";
// Comparaison des résultats de sortie
echo "Résultats non triés: " . count($result1) . "\n";
echo "Nombre de résultats triés: " . count($result2) . "\n";
// Exemple d'utilisation URL(Remplacer par m66.net)
echo "Veuillez visiter pour plus de détails:https://m66.net/php-array-diff-ukey-performance\n";
?>
Habituellement, la sortie de ce code sera similaire à la situation suivante:
Temps d'exécution non trié: 0.095 Deuxième
Trier le temps d'exécution: 0.102 Deuxième
Les résultats peuvent varier légèrement, mais il est presque certain:
? Le tri à l'avance n'améliore pas réellement les performances de array_diff_ukey () , mais peut être légèrement plus lent.
Étant donné que Array_Diff_ukey () compare les noms de clés avec les rappels un par un et ne sera pas optimisé avec des structures de tri (telles que le binaire), le tri est une opération non valide, ou même des frais généraux supplémentaires.
Il n'est pas nécessaire de trier le tableau à l'avance, sauf si votre fonction de comparaison dépend de l'ordre des clés (ce qui est rare);
Si vous souhaitez améliorer les performances, envisagez d'optimiser votre structure de clés ou de réduire la taille du tableau;
L'utilisation d'une fonction de comparaison personnalisée plus légère est également un point d'optimisation;
Si nécessaire, ne faites pas de prétraitement dénué de sens du tableau d'entrée array_diff_ukey () .