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 :

Utiliser la fonction in_array


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mai 2006
    Messages : 41
    Points : 47
    Points
    47
    Par défaut Utiliser la fonction in_array
    Bonjour,

    Je n'obtiens pas le bon résultat de test avec in_array :
    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
    <?php
    /*
    Contenu de indesirables.txt
       zzz@onlinesuccessmodel.com
      aaa@smtp.fashionesta.com
      BBB@azecris.fr
      ccc@onlinesuccessmodel.com
      DDD@gmail.com
    */
     
    $fichier_lire = fopen('indesirables.txt', 'r');
    while (!feof($fichier_lire)) {
    	$tab_lignes[] = fgets($fichier_lire); 
    }
    fclose($fichier_lire);
     
    echo 'APRES TRAITEMENT'.'<br>';
    foreach ($tab_lignes as $ligne)
    { 
      list($prefixe, $suffixe)= explode('@', $ligne); 
      $tab_desirable = array('azecris.fr', 'gmail.com');
      if (!in_array($suffixe, $tab_desirable))
      {
        echo "@".trim($suffixe); 
        echo "<BR>"; 
      } else if (in_array($suffixe, $tab_desirable))
      {
        echo $ligne;
        echo "<BR>"; 
      }
    }
    APRES TRAITEMENT - erreur :
    @onlinesuccessmodel.com
    @smtp.fashionesta.com
    @azecris.fr
    @onlinesuccessmodel.com
    @gmail.com
    APRES TRAITEMENT - je voudrais obtenir :
    @onlinesuccessmodel.com
    @smtp.fashionesta.com
    BBB@azecris.fr
    @onlinesuccessmodel.com
    DDD@gmail.com
    J'ai besoin de votre aide SVP.

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 429
    Points : 15 801
    Points
    15 801
    Par défaut
    j'obtiens bien le bon tri du tableau avec votre code.
    affichez le contenu de $tab_lignes pour vérifier qu'il est comme vous l'imaginez.

  3. #3
    Futur Membre du Club
    Femme Profil pro
    hobby
    Inscrit en
    Avril 2024
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : hobby

    Informations forums :
    Inscription : Avril 2024
    Messages : 4
    Points : 8
    Points
    8
    Par défaut
    Bonjour,
    La fonction in_array ne fonctionne pas bien à cause du caractère de retour à la ligne du fichier txt.
    Il convient donc de les supprimer avant le traitement:

    Code PHP : 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
     <?php
    /*
    Contenu de indesirables.txt
       zzz@onlinesuccessmodel.com
      aaa@smtp.fashionesta.com
      BBB@azecris.fr
      ccc@onlinesuccessmodel.com
      DDD@gmail.com
    */
     
    $fichier_lire = fopen('fichier.txt', 'rb');
    while (!feof($fichier_lire)) {
    	$tab_lignes[] = fgets($fichier_lire); 
    }
    fclose($fichier_lire);
    echo 'APRES TRAITEMENT'.'<br>';
     
     
    foreach ($tab_lignes as $ligne)
    { 
    	$ligne= str_replace(array("\r\n", "\n", "\r"), "", $ligne);   // on retire les caractères de retour à la ligne
      if(strlen($ligne)>0){        // on vérifie si la ligne du fichier n'est pas vide
     
    	  list($prefixe, $suffixe)= explode('@', $ligne); 
    	  $tab_desirable = array("azecris.fr","gmail.com");
    	  if (! in_array($suffixe, $tab_desirable))
    	  {
    		echo "@".trim($suffixe); 
    		 echo "<BR>"; 
    	  } else if (in_array($suffixe, $tab_desirable))
    	  {
    		echo $ligne;
    		echo "<BR>"; 
    	  }
    	  }
    }

    A bientôt

  4. #4
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mai 2006
    Messages : 41
    Points : 47
    Points
    47
    Par défaut
    Merci de vous intéresser à mon sujet.

    Mais le nouveau code proposé par HelloWorldFr ne change rien au résultat par rapport au mien.

    revoir
    APRES TRAITEMENT - je voudrais obtenir :
    ...

  5. #5
    Futur Membre du Club
    Femme Profil pro
    hobby
    Inscrit en
    Avril 2024
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : hobby

    Informations forums :
    Inscription : Avril 2024
    Messages : 4
    Points : 8
    Points
    8
    Par défaut
    Bonjour,
    De mon coté j'ai bien le résultat escompté:
    APRES TRAITEMENT
    @onlinesuccessmodel.com
    @smtp.fashionesta.com
    BBB@azecris.fr
    @onlinesuccessmodel.com
    DDD@gmail.com
    je ne sais pas si tu à remarquer, mais j'utilisai de mon coté le fichier "fichier.txt" au lieu de "indesirables.txt" pour les tests.

    Code PHP : 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
     <?php
    /*
    Contenu de indesirables.txt
       zzz@onlinesuccessmodel.com
      aaa@smtp.fashionesta.com
      BBB@azecris.fr
      ccc@onlinesuccessmodel.com
      DDD@gmail.com
    */
     
    $fichier_lire = fopen('indesirables.txt', 'r');
    while (!feof($fichier_lire)) {
    	$tab_lignes[] = fgets($fichier_lire); 
    }
    fclose($fichier_lire);
    echo 'APRES TRAITEMENT'.'<br>';
     
     
    foreach ($tab_lignes as $ligne)
    { 
    	$ligne= str_replace(array("\r\n", "\n", "\r"), "", $ligne);
      if(strlen($ligne)>0){
     
    	  list($prefixe, $suffixe)= explode('@', $ligne); 
    	  $tab_desirable = array("azecris.fr","gmail.com");
    	  if (! in_array($suffixe, $tab_desirable))
    	  {
    		echo "@".trim($suffixe); 
    		 echo "<BR>"; 
    	  } else if (in_array($suffixe, $tab_desirable))
    	  {
    		echo $ligne;
    		echo "<BR>"; 
    	  }
    	  }
    }

    Tu est sur quel système d'exploitation?
    Pourrai-tu nous donner plus de détail si cela ne convient pas?

  6. #6
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 256
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 256
    Points : 8 552
    Points
    8 552
    Billets dans le blog
    17
    Par défaut
    Si je comprends bien tu veux dans l'ordre :
    -- 1. Le domaine seul d'un e-mail indésirable
    -- 2. Le mail complet d'un domaine accepté

    Ton script chez moi :

    APRES TRAITEMENT<br>@onlinesuccessmodel.com<BR>@smtp.fashionesta.com<BR>@azecris.fr<BR>@onlinesuccessmodel.com<BR>@gmail.com<BR>PHP Warning: Undefined array key 1 in /home/tests/f443.php on line 21
    Warning: Undefined array key 1 in /home/tests/f443.php on line 21
    PHP Deprecated: trim(): Passing null to parameter #1 ($string) of type string is deprecated in /home/tests/f443.php on line 25
    Deprecated: trim(): Passing null to parameter #1 ($string) of type string is deprecated in /home/tests/f443.php on line 25
    @<BR>
    Avec le fichier indesirables.txt suivant :

    Contenu de indesirables.txt
    zzz@onlinesuccessmodel.com
    aaa@smtp.fashionesta.com
    BBB@azecris.fr
    ccc@onlinesuccessmodel.com
    DDD@gmail.com
    Je propose :

    Code PHP : 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
    $emails = [
        'zzz@onlinesuccessmodel.com',
        'aaa@onlinesuccessmodel.com',
        'fff@gmail.com',
        'DDD@gmail.com',
    ];
     
    $rejected = file('indesirables.txt', FILE_IGNORE_NEW_LINES);
     
    $allowed = ['azecris.fr', 'gmail.com'];
     
    foreach ($emails as $email) {
        [$user, $domain] = explode('@', $email); // On espère 1 et 1 seul "@"
        if (in_array($email, $rejected)) { // E-mail indésirable ?
            echo "@{$domain}<br>\r\n";
        } elseif (in_array($domain, $allowed)) { // Dommaine accepté ?
            echo "{$email}<br>\r\n";
        } else { // Autre situation ?
            echo "{$email} = Ni domaine accepté et ni mail rejeté<br>\r\n";
        }
    }

    Produit :

    @onlinesuccessmodel.com<br>
    aaa@onlinesuccessmodel.com = Ni domaine accepté et ni mail rejeté<br>
    fff@gmail.com<br>
    @gmail.com<br>
    Si ça ne te convient pas donne un exemple avec $emails valorisée et le résultat attendu.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  7. #7
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mai 2006
    Messages : 41
    Points : 47
    Points
    47
    Par défaut
    re,
    Vos propositions ne donne pas le résultat que j'attends du code.
    indesirable.txt contient une liste d'adresses mail suivante (extrait) :
    etigs9p@smtp.fashionesta.com
    jacques@azecris.fr
    q9b0zj@onlinesuccessmodel.com
    bill@gmail.com
    29522649399516169.269f91lk5aw1ymq@smtp.fashionesta.com
    adambyrnew@outlook.com
    bncmail2c93@ogesolitaire.fr
    bounce17aa@reronmystique.fr
    bounce1867@reronmystique.fr
    carrefour@email.carrefour.fr
    contact@belleaunaturel.fr
    contact@bienlebonjourdandre.com
    contact@caisse-epargne.fr
    Et le but est d'obtenir une liste de domaines suivante, et les adresses mail entières pour les exceptions contenues dans le tableau suivant :

    $tab_desirable = array("azecris.fr","gmail.com");


    Donc le résultat attendu suivant :

    @smtp.fashionesta.com
    jacques@azecris.fr
    @onlinesuccessmodel.com
    bill@gmail.com
    @smtp.fashionesta.com
    @outlook.com
    @ogesolitaire.fr
    @reronmystique.fr
    @reronmystique.fr
    @email.carrefour.fr
    @belleaunaturel.fr
    @bienlebonjourdandre.com
    @caisse-epargne.fr
    Ceci a pour finalité d'être utilisé dans Outlook pour modifier ma liste d'indésirable.

  8. #8
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 256
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 256
    Points : 8 552
    Points
    8 552
    Billets dans le blog
    17
    Par défaut
    Ok, c'est plus simple que je ne pensais :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
     
    $blacklist = file(__DIR__ . '/indesirables.txt', FILE_IGNORE_NEW_LINES);
     
    $allowed = ['azecris.fr', 'gmail.com'];
     
    foreach ($blacklist as $email) {
        [$user, $domain] = explode('@', $email);
        if (in_array($domain, $allowed)) {
            echo "{$email}\r\n";
        } else {
            echo "@{$domain}\r\n";
        }
    }

    Avec indesirables.txt :

    etigs9p@smtp.fashionesta.com
    jacques@azecris.fr
    q9b0zj@onlinesuccessmodel.com
    bill@gmail.com
    29522649399516169.269f91lk5aw1ymq@smtp.fashionesta.com
    adambyrnew@outlook.com
    bncmail2c93@ogesolitaire.fr
    bounce17aa@reronmystique.fr
    bounce1867@reronmystique.fr
    carrefour@email.carrefour.fr
    contact@belleaunaturel.fr
    contact@bienlebonjourdandre.com
    contact@caisse-epargne.fr
    Cela donne :

    @smtp.fashionesta.com
    jacques@azecris.fr
    @onlinesuccessmodel.com
    bill@gmail.com
    @smtp.fashionesta.com
    @outlook.com
    @ogesolitaire.fr
    @reronmystique.fr
    @reronmystique.fr
    @email.carrefour.fr
    @belleaunaturel.fr
    @bienlebonjourdandre.com
    @caisse-epargne.fr
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  9. #9
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mai 2006
    Messages : 41
    Points : 47
    Points
    47
    Par défaut
    J'ai appliqué ton code Sèb. et j'obtiens ceci :


    @smtp.fashionesta.com
    @azecris.fr
    @onlinesuccessmodel.com
    @gmail.com
    @smtp.fashionesta.com
    @smtp.fashionesta.com
    @smtp.fashionesta.com
    @smtp.fashionesta.com
    @smtp.fashionesta.com
    @onlinesuccessmodel.com
    @smtp.fashionesta.com
    @actu.comarketing-news.fr
    @actu.comarketing-news.fr
    @actu.comarketing-news.fr
    @outlook.com
    @ogesolitaire.fr
    ...
    donc pas résolu.

    Je précise :
    - je test en local avec Wampserver
    - sous Windows 10

  10. #10
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 256
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 256
    Points : 8 552
    Points
    8 552
    Billets dans le blog
    17
    Par défaut
    Chez moi ça fonctionne, alors sans infos supplémentaires de ta part je ne pourrai rien de plus.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  11. #11
    Futur Membre du Club
    Femme Profil pro
    hobby
    Inscrit en
    Avril 2024
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : hobby

    Informations forums :
    Inscription : Avril 2024
    Messages : 4
    Points : 8
    Points
    8
    Par défaut
    De mon côté cela fonctionne aussi:

    APRES TRAITEMENT
    @smtp.fashionesta.com
    jacques@azecris.fr
    @onlinesuccessmodel.com
    bill@gmail.com
    @smtp.fashionesta.com
    @outlook.com
    @ogesolitaire.fr
    @reronmystique.fr
    @reronmystique.fr
    @email.carrefour.fr
    @belleaunaturel.fr
    @bienlebonjourdandre.com
    @caisse-epargne.fr

  12. #12
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mai 2006
    Messages : 41
    Points : 47
    Points
    47
    Par défaut
    J'ai modifié en utilisant file()

    file('indesirables.txt', FILE_IGNORE_NEW_LINES);
    Mais rien n'y fait. PHP ne prends pas en compte les exceptions de in_array()

  13. #13
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 256
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 256
    Points : 8 552
    Points
    8 552
    Billets dans le blog
    17
    Par défaut
    La moindre des choses est de donner un script exécutable qu'on pourrait tester et corriger
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  14. #14
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mai 2006
    Messages : 41
    Points : 47
    Points
    47
    Par défaut
    re bonjour,

    J'ai filtré les emails source avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $email = filter_var($email, FILTER_SANITIZE_EMAIL);
    et cela fonctionne maintenant

    Code complet :
    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
     
    $tab_emails = file('indesirables.txt', FILE_IGNORE_NEW_LINES);
    echo 'APRES TRAITEMENT'.'<br>';
    foreach ($tab_emails as $email)
    { 
      $email = filter_var($email, FILTER_SANITIZE_EMAIL);
      list($prefixe,$domaine)= explode("@",$email);
    	$tab_except = array('azecris.fr', 'gmail.com');
      if (in_array($domaine, $tab_except)) { // domaine est la valeur cherchée
        echo $email; //affiche l'email complet
        echo '<BR>';
      } else {
        echo "@".$domaine; //affiche seulement le domaine précédé de @
        echo '<BR>';
      }
    }
    Merci quand même de vos contributions.

  15. #15
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 256
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 256
    Points : 8 552
    Points
    8 552
    Billets dans le blog
    17
    Par défaut
    OK, donc il y a quelque chose qui gêne dans ton fichier, qui n'est pas tel que tu le crois et ni comme tu l'as transmis, et que tu supprimes avec filter_var()
    Le problème réel n'est pas réglé

    J'aime bien le "merci quand même"
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  16. #16
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 905
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 905
    Points : 14 822
    Points
    14 822
    Par défaut
    Plusieurs pistes d'optimisation du script :

    - sortir ton tableau $tab_except de la boucle : inutile de le réaffecter à chaque passage.
    - faire un array_flip() de ton tableau $tab_except et remplacer in_array() par isset() qui est bien plus performant. En fonction du nombre de passages dans la boucle, le gain ne sera pas négligeable.

Discussions similaires

  1. [MySQL] Soucis avec la fonction in_array
    Par fwebconcept dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 19/10/2013, 19h57
  2. Soucis avec Fonction in_array
    Par poleta77 dans le forum Langage
    Réponses: 3
    Dernier message: 27/01/2010, 12h39
  3. [Tableaux] Pb avec fonction in_array
    Par yveslens dans le forum Langage
    Réponses: 4
    Dernier message: 27/03/2007, 14h34
  4. Réponses: 13
    Dernier message: 20/03/2003, 09h11
  5. [VBA-E] avec une fonction value
    Par laas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2002, 14h22

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