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 :

Compter les valeurs enlevant les doublons


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut Compter les valeurs enlevant les doublons
    Bonjour,

    Afin de réaliser un graphique j'ai besoin de réaliser les actions ci-dessous

    J'ai une chaîne ou un tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $Machaine = "Windows#Linux#Windows#Windows#Linux#Autre#Autre";
    Actuellement pour enlever les doublons je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $rows = explode('#', $Machaine);
    $datas = array_flip($rows);	
     
    foreach($datas  AS $data => $valeur)
    {
     echo $data."<br/>";
    }
    Ce qui m'affiche :

    Windows
    Linux
    Autre

    Maintenant savez vous comment faire pour compter le nombre d’occurrences, pour que ça m'affiche :

    3;Windows
    2;Linux
    2;Autre

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Array_flip c'était une bonne idée mais on ne peut pas tout avoir dans la vie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $rows = explode('#', $Machaine);
    foreach ($rows as $value) {
         @$compte[$value]++;
    }
     
    foreach ($compte as $key=>$value) {
       echo $value . ';' . $key . '</br>';
    }

  3. #3
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    je ferais plutôt comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $Machaine = "Windows#Linux#Windows#Windows#Linux#Autre#Autre";
    $rows     = explode('#', $Machaine);
    $data     = array_flip($rows);            // valeurs uniques
    $freq     = array_count_values($rows);    // fréquence de chaque valeur

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Pour le coup array_flip() n'est plus utile : array_count_values() fait le travail de rassemblement et de comptage.

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut
    Désolé d'avoir lancé un débat

    Alors déjà première question, pourquoi quand je parse mon CSV pour afficher mes OS $row[18], il affiche tout mes OS avec les doublons, ligne par ligne, etc.

    Et quand je fait ma boucle foreach il n'affiche pas les doublons

    je ne comprends rien.

    En fait je parse un csv, merci RawSrc

    Donc le code ci-dessous serait correct car il n'affiche pas les doublons, mais il ne compte pas la fréquence de chaque valeur

    PS : Le php ce n'est pas pour moi je crois, pares ça j arrete

    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
    $asset = array();
    $f = fopen($AssetExtractFilename, "r");
    fgetcsv($f, 1024, ";", '"'); // saut de l'en-tête
    while (($row = fgetcsv($f, 1024, ';', '"')) !== false)
    {
    	$asset[$row[18]] = $row;
    	//echo $row[18]."<br>";
    }
    fclose($f);
     
    foreach ($asset as $server_id =>$details)
    {
     
    	echo $details[18]."<br>";
     
    }

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    mon code de parsage considère que les server_id sont uniques dans le fichier csv. Si des doublons à ce niveau sont possibles c'est le principe du dernier qui a parlé qui a raison.

    N'oublie pas que le tableau $asset est un tableau de tableaux... Le array_count_values() ne risque pas dans ce cas de te donner le résultat escompté... (En PHP, la clé d'un tableau est obligatoirement un scalaire...)

    Pose plus précisément ta question en rapport avec les données manipulées et indique sur quelle colonne de ton csv, tu dois calculer la fréquence.

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut
    heureusement que tu est là

    Oui mes id serveurs sont uniques.

    Ce qui m’intéresse c'est la colonne 18 du csv, qui contient mes OS. Donc il y a des doublons.

    W2008
    W2003
    W2008R2
    Linux
    W2008R2
    Linux
    W2003
    w2003r2
    w2003
    ....

    Je souhaiterai donc compter le nombre d’occurrences de chaque OS par exemple, dans ma colonne 18.

    Merci encore à vous, heureusement que DVP EST Là

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    comme ça :
    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
    // tu laisses le code d'acquisition des données CSV tel quel :
    // on ne va pas s'amuser à mélanger l'acquisition avec des stats... 
    $asset = array();
    $f     = fopen($AssetExtractFilename, 'r');
    fgetcsv($f, 1024, ";", '"'); // saut de l'en-tête
    while (($row = fgetcsv($f, 1024, ';', '"')) !== false)
    {
        $asset[$row[8]] = $row;
    }
    fclose($f);
     
    // STATS
    $os = array();
    foreach ($asset as $server_id => $details)
    {
        $os[] = $details[18];
    }
    $os_freq = array_count_values($os);

  9. #9
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut
    C'est parfait, merci martin encore une fois

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 30/10/2013, 16h44
  2. Réponses: 7
    Dernier message: 08/01/2013, 12h03
  3. enlever les slashes devant les apostrophes dans les mails
    Par laurentSc dans le forum Langage
    Réponses: 10
    Dernier message: 16/11/2010, 19h57
  4. Réponses: 9
    Dernier message: 27/01/2010, 10h54

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