IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Tableaux] in_array VS isset


Sujet :

Langage PHP

  1. #1
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut [Tableaux] in_array VS isset


    Suite à une requête, j'ai une liste d'identifiants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    1,
    1,
    2,
    3,
    4,
    4,
    2,
    4,
    3,
    ...
    100234,
    100235,
    ...
    Ces identifiants ne sont pas et ne peuvent pas être ordonnés, et je peut en avoir quelques centaines de milliers. Ils arrivent un par un suite à un mysql_fetch

    Je doit faire des traitements dessus et je dois savoir si ce traitement a déjà été fait.

    Deux solutions s'offrent à moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    array(
       '100234' => 1,
       '2'      => 1,
       '100235' => 1
    )
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    array(
       '100234', '2', '100235'
    )

    Pour l'ajout, j'utilise pour la première solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tablo[$id_en_cours] = 1;
    Et pour la deuxième :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tablo[] = $id_en_cours;

    Pour faire mon test, j'utilise pour la première solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (isset($tablo[$id_en_cours]))
    Et pour la deuxième :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (in_array($id_en_cours, $tablo))
    Avez-vous un avis éclairé sur la question, quelle méthode parait la plus performante, autant à l'ajout qu'à la vérification ?

    Auriez vous d'autres méthodes sous le coude ?

  2. #2
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    la franchement je sais pas,
    j'aurais tendance a privilegier le isset qui va tester une existence et ne pas parcourir tout le tableau comme le ferais un in_array

  3. #3
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Bien vu siddh !

    Je viens de faire un test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    <?php
     
    $nb = 10000;
    $tablo_1 = array();
    $tablo_2 = array();
    for($i = 0 ; $i < $nb ; $i++) {
        $val = mt_rand(1, $nb);
        $tablo_1[$val] = 1;
        $tablo_2[]     = $val;
    }
     
    function microtime_float()
    {
      list($usec, $sec) = explode(" ", microtime());
      return ((float)$usec + (float)$sec);
    }
     
     
    $start = microtime_float();
    for($i = 0 ; $i < $nb ; $i++) {
        isset($tablo_1[$i]);
    }
    echo microtime_float() - $start;
     
    echo '<hr />'; flush();
     
    $start = microtime_float();
    for($i = 0 ; $i < $nb ; $i++) {
        in_array($i, $tablo_2);
    }
    echo microtime_float() - $start;
     
    echo '<hr />'; flush();
     
    $start = microtime_float();
    for($i = 0 ; $i < $nb ; $i++) {
        isset($tablo_1[$i]);
    }
    echo microtime_float() - $start;
     
    echo '<hr />'; flush();
     
    $start = microtime_float();
    for($i = 0 ; $i < $nb ; $i++) {
        in_array($i, $tablo_2);
    }
    echo microtime_float() - $start;
     
    echo '<hr />'; flush();
     
    $start = microtime_float();
    for($i = 0 ; $i < $nb ; $i++) {
        isset($tablo_1[$i]);
    }
    echo microtime_float() - $start;
     
    echo '<hr />'; flush();
     
    $start = microtime_float();
    for($i = 0 ; $i < $nb ; $i++) {
        in_array($i, $tablo_2);
    }
    echo microtime_float() - $start;
     
    echo '<hr />'; flush();
     
     
    ?>
    Je teste d'abord isset, puis in_array, puis je repete ca encore deux fois pour être sur. Voici le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    0.015042066574097
    4.7421550750732
    0.010402917861938
    4.6207950115204
    0.010471105575562
    4.6121029853821
    Sans commentaires je crois
    10 ms secondes pour isset contre 4.6 secondes pour in_array !

    Désolé du dérangement les amis

  4. #4
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Juste pour rigoler, avec 100000, pour isset :
    pour in_array :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Maximum execution time of 30 seconds exceeded in ...

  5. #5
    Membre éclairé
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Points : 764
    Points
    764
    Par défaut
    pendant que tu y es, y a t-il une différence de performances entre isset() et array_key_exists() ?

    Sinon pour l'explication, je crois avoir lu que les clés étaient stockées dans des "tables de hash" et bénéficieraient donc d'un accès très rapide. Mais bon... je m'avance beaucoup...

  6. #6
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    le mieux serais a mon avis de se faire une bitmap (pas un bmp einh) il me semble avoir vu un truc la dessus pour php5 mais je sais plus ou

  7. #7
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Pour 100000 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    isset : 0.10658693313599
    array_key_exists : 0.14800190925598
    isset : 0.10657691955566
    array_key_exists : 0.15488290786743
    isset : 0.11252903938293
    array_key_exists : 0.14288592338562
    isset : 0.10775089263916
    array_key_exists : 0.13956499099731
    isset : 0.10635709762573
    array_key_exists : 0.13756799697876
    isset : 0.10588908195496
    array_key_exists : 0.14004588127136
    isset : 0.11063504219055
    array_key_exists : 0.14373397827148
    isset : 0.10627484321594
    array_key_exists : 0.13867902755737
    isset : 0.10619401931763
    array_key_exists : 0.14453816413879
    isset : 0.10568809509277
    array_key_exists : 0.13803005218506
    Je suis à disposition pour faire d'autre tests

  8. #8
    Membre éclairé
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Points : 764
    Points
    764
    Par défaut
    Oki... donc je continue à utiliser isset() quand c'est possible merci

  9. #9
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Détail qui a peut-etre son importance, je suis sous php4. Je sais pas si ils ont touché à ça depuis, ce qui m'étonnerait, mais autant lever l'ambiguité.

  10. #10
    Membre éclairé
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Points : 764
    Points
    764
    Par défaut
    quelle version de PHP 4 d'ailleurs ? (il y a eu pas mal de changement avec PHP 4.3.10 et PHP 4.4.0 il me semble)

  11. #11
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    4.3.11

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tableaux] in_array ne fonctionne pas?
    Par Invité dans le forum Langage
    Réponses: 2
    Dernier message: 12/06/2009, 10h43
  2. [Tableaux] in_array donne résultats inattendus
    Par renaud26 dans le forum Langage
    Réponses: 1
    Dernier message: 05/12/2007, 10h39
  3. [Tableaux] in_array() est-elle récursive?
    Par Anduriel dans le forum Langage
    Réponses: 10
    Dernier message: 15/07/2006, 22h16
  4. [Tableaux] pb avec isset et formulaire non complété
    Par PuppeT mAsTer dans le forum Langage
    Réponses: 5
    Dernier message: 11/06/2006, 12h31
  5. [Tableaux] in_array
    Par Anduriel dans le forum Langage
    Réponses: 3
    Dernier message: 10/04/2006, 17h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo