Maison > développement back-end > tutoriel php > Différences entre array_diff et d'autres façons d'implémenter la traversée de tableaux PHP

Différences entre array_diff et d'autres façons d'implémenter la traversée de tableaux PHP

巴扎黑
Libérer: 2023-03-07 21:34:02
original
1607 Les gens l'ont consulté

Donnez-vous deux tableaux de 5000 éléments chacun et calculez leur différence. Pour parler franchement, cela signifie utiliser PHP et l'algorithme que vous pensez être le meilleur pour implémenter l'algorithme array_diff.

Quand j'ai reçu cette question pour la première fois, je l'ai trouvée très simple, j'en ai donc écrit une basée sur mon expérience passée :

function array_diff($array_1, $array_2) { 
    $diff = array(); 
 
    foreach ($array_1 as $k => $v1) { 
        $flag = false; 
        foreach ($array_2 as $v2) { 
            if ($flag = ($v1 == $v2)) { 
                break; 
            } 
        } 
 
        if (!$flag) { 
            $diff[$k] = $v1; 
            
        } 
    } 
 
    return $diff; 
}
Copier après la connexion

Bien que la mise en œuvre soit possible, j'ai trouvé que le l'efficacité de cette fonction est horrible. J'ai donc reconsidéré et optimisé l'algorithme. La deuxième fonction ressemblait à ceci :

function array_diff($array_1, $array_2) { 
    foreach ($array_1 as $key => $item) { 
        if (in_array($item, $array_2, true)) { 
            unset($array_1[$key]); 
        } 
    } 
 
    return $array_1; 
}
Copier après la connexion

Eh bien, cette fois, elle est presque aussi rapide que la fonction array_diff d'origine. Mais existe-t-il une méthode plus optimisée ? Dans un article sur ChinaUnix, j'ai découvert que PHP peut s'écrire comme ceci :

function array_diff($array_1, $array_2) { 
    $array_2 = array_flip($array_2); 
    foreach ($array_1 as $key => $item) { 
        if (isset($array_2[$item])) { 
            unset($array_1[$key]); 
        } 
     } 
 
    return $array_1; 
}
Copier après la connexion

L'efficacité de cette fonction est étonnante, encore plus rapide que la fonction array_diff d'origine. En enquêtant sur la raison, j'ai trouvé une explication : comme les clés sont organisées par HASH, la recherche est très rapide ; tandis que la valeur n'est stockée que dans l'organisation des clés et n'a pas d'index elle-même, donc chaque recherche est parcourue.

Résumé

Bien que ce soit une petite astuce du langage PHP, en parcourant et en comparant les valeurs du tableau, si vous avez besoin de comparer la valeur, l'inverser avec la clé est en effet meilleur que le rapport valeur-valeur habituel. L'efficacité de la comparaison est beaucoup plus élevée.

Par exemple, la fonction deux ci-dessus doit appeler la fonction in_array et doit effectuer une boucle pour déterminer si elle se trouve dans la fonction ; tandis que la fonction trois détermine uniquement si la clé existe dans le tableau. Couplé aux différentes méthodes d'indexation organisationnelle des clés et des valeurs des tableaux, il est tout à fait compréhensible que l'efficacité soit plus élevée qu'on ne l'imaginait.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal