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 :

utilisation de str_replace [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Par défaut utilisation de str_replace
    Bonjour à tous
    J'ai un tableau $cumul issu de la fusion de plusieurs csv.
    A l'affichage de $cumul, j'obtiens :
    1 Pierre 865
    2 Paul 863
    3 Michel 860.00
    4 Jean 856
    ....
    Le format du score (colonne 3) diffère selon la version du programme ayant généré le csv.
    Vous avez compris que je souhaite remplacer 860.00 par 860.
    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $cumul = str_replace( ".00",  "", $cumul);
    Mais rien ne change.
    Soit j'utilise mal la fonction, soit elle n'est pas adaptée à mon cas ?

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    utilise intval

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Par défaut
    Ah ben oui,c'est bien plus facile avec intval !!!
    Merci Stealth.
    Un autre souci, toujours dans mon tableau $cumul :
    1 Pierre 865
    2 Paul 860
    3 Michel 860
    4 Jean 856
    ...
    En cas de score identique(colonne 3), je voudrais afficher :
    1 Pierre 865
    2 Paul 860
    2 Michel 860
    4 Jean 856
    ...
    Sachant que la colonne 1 a été créée par incrémentation de 1 à sizeof($cumul)

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    montre ton code complet

    ps : pas de sizeof c'est count

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Par défaut
    Voilà :
    - à la ligne 33, j'ai un tri par score décroissants (colonne[8]).
    - à la ligne 43, j'ai ajouté une simple numérotation par ligne (colonne[0]).
    Ce que je souhaite, c'est que cette numérotation tienne compte des ex-aequo
    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    <?php
    $fusion = array(); // tableau vide
     
    // traitement du 1er csv
    $g1 = "gondrecourt/CLTP1.csv";
    if(file_exists($g1)) {  
    $pg1 = fopen($g1, 'rb');
    while (($ligne = fgetcsv($pg1, 1000, ",")) !== FALSE) {
     	$fusion[] = $ligne;	 
    }
     array_pop($fusion);	
     }
    // traitement du 2ème csv
    $m1 = "montrouge/CLTP1.csv"; 
    if(file_exists($m1)) { 
    $pm1 = fopen($m1, 'rb'); 
    while (($ligne = fgetcsv($pm1, 1000, ",")) !== FALSE) { 
     	$fusion[] = $ligne;	
     
    }				 
     array_pop($fusion); 
     }
    // traitement du 3ème csv
    $q1 = "quimper/CLTP1.csv";
    if(file_exists($q1)) {  
    $pq1 = fopen($q1, 'rb'); 
    while (($ligne = fgetcsv($pq1, 1000, ",")) !== FALSE) { 
     	$fusion[] = $ligne;	  
    }	
     array_pop($fusion);  
     } 
     
     // tri par score
    	function cmpclass($a, $b) {
    		if ($a[8] == $b[8]) {
    			return 0;
    		}
    		//inversion de la comparaison pour ordre décroissant
    		return ($a[8] > $b[8]) ? -1 : 1;
    	}
    	usort($fusion, "cmpclass");
     
    //ajout du classement
        $j = sizeof($fusion) ;
      	for ($i = 0; $i < $j; ++$i) {   
    	$fusion[$i][0] = $i+1;
    	$fusion[$i][0] = ++$i+1;
      }
     
       array_pop($fusion); 
     
    // fusion nom et prénom   
      for ($i = 0; $i < $j; ++$i) {  
    	$fusion[$i][1] = $fusion[$i][2]." ".$fusion[$i][3];
    	unset ($fusion[$i][2]);
    	unset ($fusion[$i][3]); 	
    	unset ($fusion[$i][7]);
      }    
     
     
    // lecture en table html de la fusion des 3 csv
    echo '<table>'; //début du tableau html	 
    echo "<colgroup></colgroup><colgroup align=left></colgroup><colgroup align=left></colgroup><colgroup></colgroup><colgroup></colgroup><colgroup></colgroup><colgroup align=right></colgroup>";
    echo  '<tr><th></th><th>nom</th><th>cat</th><th>série</th><th>club</th><th>cumul</th></tr>';  
     
    foreach($fusion as $ligne)   {		
    	echo '<tr>'; //début de la ligne 
    	foreach ($ligne as $i => $elt) {
    		echo '<td>'.$elt.'</td>'; // une cas de la ligne
    	}
    	echo '</tr>'; //fin de la ligne
    }
    echo '</table>'; //fin du tableau html
     
     
     //export csv
    $fp = fopen('csv/cumul1.csv', 'w');
    foreach ($fusion as $fields) {
        fputcsv($fp, $fields, ';');
    }
    fclose($fp); 
    	?>

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $fusion[$ligne[2]][] = $ligne;
    ensuite tu ferras un array_values + implode

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Par défaut
    Là, je comprends plus...
    Ca dépasse mes faibles connaissances.

    Je cherche un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      for ($i = 0; $i < $j; ++$i) {
    si       $fusion[$i+1][8] = $fusion[$i][8]  //scores identiques
    alors   $fusion[$i+1][0] = $fusion[$i][0]  //classement identique
    sinon  $fusion[$i+1][0] = $fusion[$i][0] + 1 //incrémentation de 1
    }
    Si tu vois ce que je veux dire...

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    un truc 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
    19
    20
    21
    $items = array(
        array(1, 'Pierre', 865),
        array(2, 'Paul'  , 860),
        array(3, 'Michel', 860),
        array(4, 'Jean'  , 856) 
    );
     
    $sort = array();
     
    foreach($items as $item) {
        $sort[]  = $item[2];
    }
     
    rsort($sort);
     
    array_multisort($items, $sort);
    $sort = array_unique($sort);
     
    foreach($items as $item) {
        echo array_search($item[2], $sort) + 1, $item[1], $item[2], "\n";
    }

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Par défaut
    Merci Stealth.
    Il me reste à essayer de l'adapter à mon cas....

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Par défaut
    L'affichage avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo array_search($item[2], $sort) + 1, $item[1], $item[2], "\n";
    est OK, mais comment obtenir le même résultat dans un tableau ?

  11. #11
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par hindioriental Voir le message
    L'affichage avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo array_search($item[2], $sort) + 1, $item[1], $item[2], "\n";
    est OK, mais comment obtenir le même résultat dans un tableau ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    array(
        array_search($item[2], $sort) + 1,
        $item[1],
        $item[2],
    )

  12. #12
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Citation Envoyé par hindioriental Voir le message
    Ah ben oui,c'est bien plus facile avec intval !!!
    Merci Stealth.
    Un autre souci, toujours dans mon tableau $cumul :
    1 Pierre 865
    2 Paul 860
    3 Michel 860
    4 Jean 856
    ...
    En cas de score identique(colonne 3), je voudrais afficher :
    1 Pierre 865
    2 Paul 860
    2 Michel 860
    4 Jean 856
    ...
    Sachant que la colonne 1 a été créée par incrémentation de 1 à sizeof($cumul)
    Ne serait il pas plus simple de ne pas inclure le classe dans la première phase d'agrégation ?
    Pour obtenir ce genre de tableau :

    Pierre 865
    Paul 860
    Michel 860
    Jean 856

    Et ensuite d'effectuer le classement ?

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Par défaut
    J'ai donc maintenant ceci :
    - fusion de 3 csv
    - tri par score décroissant [8]
    - classement par place avec gestion ex-aequo
    Dernier souci : en ligne 74, je fais un export csv du tableau avec
    $fp = fopen('csv/test.csv', 'w+');
    Malheureusement,seulement la dernière ligne de mon tableau est exportée.
    Avec l'option 'a+' le tableau complet est exporté, mais autant de fois que la page est rechargée.
    Il doit y avoir une erreur dans le foreach de la ligne 76.... Mais je vois pas.

    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
    70
    71
     
    <?php
    $fusion = array(); // tableau vide
     
    // traitement du 1er csv
    $g1 = "gondrecourt/CLTP1.csv";
    if(file_exists($g1)) {  
    $pg1 = fopen($g1, 'rb');
    while (($ligne = fgetcsv($pg1, 1000, ",")) !== FALSE) {
     	$fusion[] = $ligne;	 
    }
     array_pop($fusion);	
     }
    // traitement du 2ème csv
    .............. 				 
     array_pop($fusion); 
     }
    // traitement du 3ème csv
    .......................	  	
     array_pop($fusion);  
     
    //suppression de colonnes inutiles		 		
       $j = sizeof($fusion) ;
      for ($i = 0; $i < $j; ++$i) {  
    $fusion[$i][1] = $fusion[$i][2]." ".$fusion[$i][3];	 
     unset ($fusion[$i][2]);
      unset ($fusion[$i][3]); 	
        unset ($fusion[$i][7]);
    }  
     
     // le tri 
    	function cmpclass($a, $b) {
    		if ($a[8] == $b[8]) {
    			return 0;
    		}
    		//inversion de la comparaison pour ordre décroissant
    		return ($a[8] > $b[8]) ? -1 : 1;
    	}
    	usort($fusion, "cmpclass"); 
     
     //le classement
      for ($i = 0; $i < $j; ++$i) {
     
    $fusion[$i][0] = $i+1;
    $fusion[$i][0] = ++$i+1;
      }	  
        array_pop($fusion);  
     
     //gestion des ex-aequo
    $sort = array();
    foreach($fusion as $item) {
        $sort[]  = $item[8];
    }
    rsort($sort);
    array_multisort($fusion, $sort);
    $sort = array_unique($sort);
     
    foreach($fusion as $item) {
    $a = array(array(array_search($item[8], $sort) + 1,$item[1],$item[4],$item[5],$item[6],$item[8]));
     
    //affichage final avec fonction externe
       echo Array2Table($a);
     
      //export csv
    $fp = fopen('csv/test.csv', 'w+');
    foreach ($a as $fields) {
        fputcsv($fp, $fields, ';');	
    	fclose($fp);
    }  
       }
    ?>

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Par défaut
    J'ai trouvé : il fallait faire un double foreach.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	 //export csv
    $fp = fopen('csv/test.csv', 'w');
     
    foreach ($fusion as $item) { 
      $a = array(array(array_search($item[8], $sort) + 1,$item[1],$item[4],$item[5],$item[6],$item[8]));
      foreach ($a as $fields) {
        fputcsv($fp, $fields, ';');
    }
    }
    fclose($fp);

  15. #15
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Par contre, même un code qui marche peut être mauvais.
    Pensez à la personne qui peut éventuellement maintenir votre code. Cette ligne est incompréhensible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $a = array(array(array_search($item[8], $sort) + 1,$item[1],$item[4],$item[5],$item[6],$item[8]));

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

Discussions similaires

  1. Utilisation de str_replace pour créer des permaliens
    Par Romanodi13 dans le forum Langage
    Réponses: 7
    Dernier message: 20/06/2010, 23h16
  2. [PHP 5.2] Utilisation de str_replace
    Par Papy214 dans le forum Langage
    Réponses: 3
    Dernier message: 10/09/2009, 11h27
  3. [PHP 5.3] Utilisation de str_replace
    Par titou_777 dans le forum Langage
    Réponses: 1
    Dernier message: 10/08/2009, 15h11
  4. Réponses: 3
    Dernier message: 26/06/2007, 12h50
  5. [MySQL] Utilisation de str_replace dans une chaine fgets
    Par marciv dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 27/10/2006, 14h19

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