Maison  >  Article  >  développement back-end  >  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

巴扎黑
巴扎黑original
2017-05-24 14:34:091549parcourir

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; 
}

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; 
}

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; 
}

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!

Déclaration:
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