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

藏色散人
Libérer: 2023-04-07 17:28:01
avant
3685 Les gens l'ont consulté

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...
Copier après la connexion
$needle = 'test for this';
$flipped_haystack = array_flip($haystack);
if ( isset($flipped_haystack[$needle]) )
{
  print "Yes it's there!";
}
Copier après la connexion
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!
Copier après la connexion

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);
Copier après la connexion

Résultat :

原始方法:0.0010008811950684
新方法:0.0069980621337891
Copier après la connexion

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);
Copier après la connexion

Résultat :

原始方法:2.9000020027161
新方法:0.008030891418457
Copier après la connexion

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:learnku.com
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