Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tri d'un tableau et calculs

Gros casse-tête

Sujet résolu
    24 septembre 2009 à 10:56:35

    Bonjour,

    Je dispose d'array contenant de multiples informations, et parfois avec des doublons.
    J'aimerais pouvoir générer un nouveau tableau à partir du premier, qui récapitulerais les informations contenus dans le premier.

    En gros j'ai :

    <?php
    $recapitulatif = array (
    "Nom_du_site" => "",
    "Temps_de_connexion" => "",
    "Octets_recus"=> "",
    "Octets_envoyes" => "");
    
    $tableau_test = array (
    "Nom_du_site" => "",
    "Temps_de_connexion" "",
    "Octets_recus"=> "",
    "Octets_envoyes" => "");	
    
    $i = 0;
    
    $recapitulatif['Nom_du_site'][0] = 'Paris';
    $recapitulatif['Nom_du_site'][1] = 'Paris';
    $recapitulatif['Nom_du_site'][2] = 'Angers';
    $recapitulatif['Temps_de_connexion'][0] = 247;
    $recapitulatif['Temps_de_connexion'][1] = 458;
    $recapitulatif['Temps_de_connexion'][2] = 158;
    $recapitulatif['Octets_recus'][0] = 5877;
    $recapitulatif['Octets_recus'][1] = 4250;
    $recapitulatif['Octets_recus'][2] = 7250;
    $recapitulatif['Octets_envoyes'][0] = 8974;
    $recapitulatif['Octets_envoyes'][1] = 6250;
    $recapitulatif['Octets_envoyes'][2] = 16250;
    ?>
    


    Et je souhaiterai que mon deuxième tableau au final se présente sous cette forme :

    <?php
    $tableau_test['Nom_du_site'][o] = 'Paris';
    $tableau_test['Nom_du_site'][1] = 'Angers';
    $tableau_test['Temps_de_connexion'][o] = 705; // 247 + 458
    $tableau_test['Temps_de_connexion'][1] = 158;
    $tableau_test['Octets_recus'][o] = 10127;  //5877 + 4250
    $tableau_test['Octets_recus'][1] = 7250;
    $tableau_test['Octets_envoyes'][o] = 15224;  //8974 + 6250
    $tableau_test['Octets_envoyes'][1] = 16250;
    ?>
    


    En gros, je parcourt une fois mon premier tableau et relève chaque valeur, puis je parcourt mon 2ème tableau et vérifie si la valeur existe déjà (ça se base sur le nom du site donc).

    Si le nom du site existe dans le 2ème tableau, je cherche toute les occurrences de ce nom de site dans le 1er tableau, je récupère les information relatives à ce site, et j'additionne les valeurs.

    Je récupère le résultat de l'addition de chaque champs dans son champ équivalent du nouveau tableau.

    Ainsi pour Paris du 1er tableau on avait :

    <gras>Paris :</gras> (1ère occurrence)
    Temps de connexion = 247
    Octets reçu = 5877
    Octets envoyes = 8974
    
    <gras>Paris :</gras> (2ème occurrence)
    Temps de connexion = 458
    Octets reçu = 4250
    Octets envoyes = 6250
    


    Et à la fin on se retrouve avec ceci :

    <gras>Paris :</gras> (Résumé)
    Temps de connexion (total) = 705
    Octets reçu (total) = 10127
    Octets envoyes (total) = 15224
    


    J'ai déjà tenté avec pas mal de fonctions je ne vais pas toute les lister ici ça prendrait trop de temps :p
    Ma dernière en date est :

    <?php
    	foreach ($recapitulatif as $test)
    	{
    		$var1[$i] = $test['Nom_du_site'];
    		$var2[$i] = $test['Temps_de_connexion'];
    		$i++;
    	}
    ?>
    


    Pour récupérer les informations.

    Le problème c'est que
    <?php
    $test['Nom_du_site'];
    $test['Temps_de_connexion'];
    ?>
    


    ne sont pas reconnus, du moins les champs ['Nom_du_site'] et ['Temps_de_connexion'].

    Je dois donc mal utiliser la fonction foreach, peut-être que ce n'est pas la bonne fonction à utiliser, enfin bref, ça va faire 7-8h que je plenche dessus, et je n'arrive pas à des résultats satisfaisants.

    Si quelqu'un pouvait me donner un nom de fonction, une piste, une page de php.net qui serait capable de m'aider à avancer (je n'attend pas qu'on me mâche le code tout cru, j'ai horreur de ça, je préfère comprendre ce que je fait).

    En vous remerciant par avance :)
    • Partager sur Facebook
    • Partager sur Twitter
      24 septembre 2009 à 11:26:32

      Salut,
      Tu cherches à faire un truc vraiment tordu par traitement PHP et assez simple par requête SQL. Elles viennent d'où ces informations ?

      Si tu veux garder ton fonctionnement par tableau, il va falloir passez par un tableau intermédiaire qui ré-indexe tout ça:
      <?php
      $recapitulatif2[0]['Nom_du_site'] = 'Paris';
      $recapitulatif2[1]['Nom_du_site'] = 'Angers';
      $recapitulatif2[0]['Temps_de_connexion'][0] = 247;
      $recapitulatif2[0]['Temps_de_connexion'][1] = 458;
      $recapitulatif2[1]['Temps_de_connexion'][0] = 158;
      $recapitulatif2[0]['Octets_recus'][0] = 5877;
      $recapitulatif2[0]['Octets_recus'][1] = 4250;
      $recapitulatif2[1]['Octets_recus'][0] = 7250;
      $recapitulatif2[0]['Octets_envoyes'][0] = 8974;
      $recapitulatif2[0]['Octets_envoyes'][1] = 6250;
      $recapitulatif2[0]['Octets_envoyes'][0] = 16250;
      

      Avec un tableau comme celui là, il devient assez simple de faire des sommes (c'est pas forcement le meilleur truc mais c'est le premier qui me vient)
      • Partager sur Facebook
      • Partager sur Twitter
        24 septembre 2009 à 11:42:19

        Bah, il semblerait que tu te bases sur le nom du lieu comme identifiant. Tu pourrais essayer de restructurer ton tableau de base en te servant de la ville comme index :
        <?php
        $recapitulatif['Paris']['Temps_de_connexion'] += 247;
        $recapitulatif['Angers']['Temps_de_connexion'] += 458;
        $recapitulatif['Angers']['Temps_de_connexion'] += 158;
        
        $recapitulatif['Paris']['Octets_recus'] += 5877;
        $recapitulatif['Angers']['Octets_recus'] += 4250;
        $recapitulatif['Angers']['Octets_recus'] += 7250;
        
        $recapitulatif['Paris']['Octets_envoyes'] += 8974;
        $recapitulatif['Angers']['Octets_envoyes'] += 6250;
        $recapitulatif['Angers']['Octets_envoyes'] += 16250;
        
        Enfin bon, c'est juste une suggestion, peut-être pas applicable à ton truc.
        • Partager sur Facebook
        • Partager sur Twitter
          24 septembre 2009 à 11:53:56

          <?php
          
          function you_got_pimped($old_tab)
          {
          	$new_tab=array('Nom_du_site'=>array(),'Octets_recus'=>array(),'Octets_envoyes'=>array());
          	$count=count($old_tab['Nom_du_site']);
          	$names=array_unique($old_tab['Nom_du_site']);
          	foreach($names as $name)
          	{
          		$received=0; $sent=0; $connexion_time=0;
          		for($i=0;$i<$count;$i++)
          		{
          			if($old_tab['Nom_du_site'][$i]==$name)
          			{
          				$received+=$old_tab['Octets_recus'][$i];
          				$sent+=$old_tab['Octets_envoyes'][$i];
          				$connexion_time+=$old_tab['Temps_de_connexion'][$i];
          			}
          		}
          		$new_tab['Nom_du_site'][]=$name;
          		$new_tab['Octets_recus'][]=$received;
          		$new_tab['Octets_envoyes'][]=$sent;
          		$new_tab['Temps_de_connexion'][]=$connexion_time;
          	}
          	return $new_tab;
          }
          ?>
          
          • Partager sur Facebook
          • Partager sur Twitter
            24 septembre 2009 à 12:34:31

            Alors franchement, je suis impressionné Oo

            Il y a certaines fonctions que je ne comprend pas parce que je ne les connaissaient pas, je vais faire le tour sur PHP.net pour bien assimiler le code que tu m'a gracieusement offert, et je reviendrais sur ce sujet pour expliquer, ligne par ligne, ce que fait ton code, tu me reprendra si je me suis trompé.

            En tout cas il marche, voici ce qu'affiche un :

            <?phpecho "<pre>"; print_r($new_tab); echo "</pre>";?>
            


            Array
            (
                [Nom_du_site] => Array
                    (
                        [0] => bcd
                        [1] => abc
                    )
            
                [Octets_recus] => Array
                    (
                        [0] => 10127
                        [1] => 7250
                    )
            
                [Octets_envoyes] => Array
                    (
                        [0] => 15224
                        [1] => 16250
                    )
            
                [Temps_de_connexion] => Array
                    (
                        [0] => 705
                        [1] => 158
                    )
            
            )
            


            Je reviens dès que j'ai entièrement assimilé le code !

            Merci encore !

            Truc de fou :o

            je t'aime :p

            • Partager sur Facebook
            • Partager sur Twitter
              7 octobre 2009 à 10:14:01

              C'est vrai que c'est assez incroyable le SQL, du moins la simplicité de la requête pour obtenir un résultat similaire :

              $query = 'SELECT *, SUM(Temps_de_connexion) AS Temps_de_connexion_total FROM `august` WHERE `Jour` = 1 AND `Mois` = 9 GROUP BY `Nom_du_site` ORDER BY `august`.`Nom_du_site` DESC';		  
              $reponse = mysql_query($query) or die ('Erreur dans l\'ex&eacute;cution de la requ&ecirc;te; $query (extraire.php)<br>');
              


              ce qui tiens en 2 lignes :D
              Pour un résultat identique et un affichage bien plus rapide :)

              (J'ai transféré toutes les données récupérées dans une BDD, en fait c'est ce que je voulais faire depuis le début mais il fallait avant que je m'entraine au php, pour bien comprendre le principe et les applications de base, maintenant le SQL est presque une promenade de santé pour faire ce que je désire :)
              • Partager sur Facebook
              • Partager sur Twitter

              Tri d'un tableau et calculs

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown