Maison > Article > développement back-end > Problèmes d'efficacité des fonctions PHP array_search et in_array
Problème
Dans une interface, il a été constaté que cela prenait beaucoup de temps. Après avoir étudié la raison, il a été constaté que lorsque array_search recherche la clé d'un élément dans. un réseau, l'efficacité augmente à mesure que le réseau devient plus grand et la consommation de temps augmente. Surtout pour les grands tableaux, cela prend beaucoup de temps. Ce problème existe également dans la fonction in_array.
Solution
Après avoir retourné array_flip, utilisez isset au lieu de la fonction in_array et utilisez $array[key] au lieu de array_search Cela peut résoudre le problème fastidieux de. grands tableaux
Voici les notes que j'ai copiées du site officiel de php Vous pouvez observer la différence d'efficacité entre les deux méthodes
Site Web original : https://www.php.net. /manual/en/function.in-array.php
If you're working with very large 2 dimensional arrays (eg 20,000+ elements) it's much faster to do this...
$needle = 'test for this'; $flipped_haystack = array_flip($haystack); if ( isset($flipped_haystack[$needle]) ) { print "Yes it's there!"; }
I had a script that went from 30+ seconds down to 2 seconds (when hunting through a 50,000 element array 50,000 times). Remember to only flip it once at the beginning of your code though!
Correction
Quelqu'un a commenté que array_flip est plus efficace que in_array et array_search Après en avoir fait. des expériences, c'est vrai. C'est quelque chose que je n'avais pas envisagé au départ. Cette solution n'est valable que si les fonctions in_array et array_search sont utilisées plusieurs fois. Vous trouverez ci-dessous les résultats de mes propres expériences. Merci @puppet d'avoir signalé le problème
<?php $array = array(); for ($i=0; $i<200000; $i++){ ##随机字符串 $array[$i] = get_rand().$i; } $str = $array[150000]; $time1 = microtime(true); array_search($str, $array); $time2 = microtime(true); echo '原始方法:'.($time2-$time1)."\n"; $time3 = microtime(true); $new_array = array_flip($array); isset($new_array[$str]); $time4 = microtime(true); echo '新方法:'.($time4-$time3);
Résultat :
原始方法:0.0010008811950684 新方法:0.0069980621337891
Boucle 5000 fois
$array = array(); for ($i=0; $i<200000; $i++){ ##随机字符串 $array[$i] = get_rand().$i; } $str = $array[199999]; $time1 = microtime(true); for ($i=0; $i<5000; $i++){ array_search($str, $array); } $time2 = microtime(true); echo '原始方法:'.($time2-$time1)."\n"; $time3 = microtime(true); $new_array = array_flip($array); for ($i=0; $i<5000; $i++){ isset($new_array[$str]); } $time4 = microtime(true); echo '新方法:'.($time4-$time3);
Résultat :
原始方法:2.9000020027161 新方法:0.008030891418457
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!