Maison  >  Article  >  développement back-end  >  Problèmes d'efficacité des fonctions PHP array_search et in_array

Problèmes d'efficacité des fonctions PHP array_search et in_array

藏色散人
藏色散人avant
2019-10-17 13:41:503614parcourir

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 &#39;原始方法:&#39;.($time2-$time1)."\n";
$time3 =  microtime(true);
$new_array = array_flip($array);
isset($new_array[$str]);
$time4 = microtime(true);
echo &#39;新方法:&#39;.($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 &#39;原始方法:&#39;.($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 &#39;新方法:&#39;.($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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer