Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/10/2011, 14h01   #1
Invité de passage
 
daniel thirion
Inscription : février 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : daniel thirion

Informations forums :
Inscription : février 2011
Messages : 21
Points : 4
Points : 4
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 :
$cumul = str_replace( ".00",  "", $cumul);
Mais rien ne change.
Soit j'utilise mal la fonction, soit elle n'est pas adaptée à mon cas ?
hindioriental est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 14h10   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
utilise intval
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 14h50   #3
Invité de passage
 
daniel thirion
Inscription : février 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : daniel thirion

Informations forums :
Inscription : février 2011
Messages : 21
Points : 4
Points : 4
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)
hindioriental est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 14h53   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
montre ton code complet

ps : pas de sizeof c'est count
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 15h07   #5
Invité de passage
 
daniel thirion
Inscription : février 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : daniel thirion

Informations forums :
Inscription : février 2011
Messages : 21
Points : 4
Points : 4
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 :
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); 
	?>
hindioriental est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 15h10   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
fait :
Code :
$fusion[$ligne[2]][] = $ligne;
ensuite tu ferras un array_values + implode
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 15h28   #7
Invité de passage
 
daniel thirion
Inscription : février 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : daniel thirion

Informations forums :
Inscription : février 2011
Messages : 21
Points : 4
Points : 4
Là, je comprends plus...
Ca dépasse mes faibles connaissances.

Je cherche un truc du genre :
Code :
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...
hindioriental est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 15h42   #8
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
un truc comme ça ?

Code :
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";
}
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 11h07   #9
Invité de passage
 
daniel thirion
Inscription : février 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : daniel thirion

Informations forums :
Inscription : février 2011
Messages : 21
Points : 4
Points : 4
Merci Stealth.
Il me reste à essayer de l'adapter à mon cas....
hindioriental est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 15h17   #10
Invité de passage
 
daniel thirion
Inscription : février 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : daniel thirion

Informations forums :
Inscription : février 2011
Messages : 21
Points : 4
Points : 4
L'affichage avec :
Code :
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 ?
hindioriental est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 16h55   #11
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
Citation:
Envoyé par hindioriental Voir le message
L'affichage avec :
Code :
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 :
1
2
3
4
5
6
 
array(
    array_search($item[2], $sort) + 1,
    $item[1],
    $item[2],
)
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/10/2011, 10h34   #12
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
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 ?
__________________
  • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
  • Merci d'utiliser les balises de code (# dans l'éditeur)
  • Si votre problème est réglé, merci d'utiliser le bouton
S.N.A.F.U
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/10/2011, 19h10   #13
Invité de passage
 
daniel thirion
Inscription : février 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : daniel thirion

Informations forums :
Inscription : février 2011
Messages : 21
Points : 4
Points : 4
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 :
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);
}  
   }
?>
hindioriental est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/10/2011, 09h57   #14
Invité de passage
 
daniel thirion
Inscription : février 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : daniel thirion

Informations forums :
Inscription : février 2011
Messages : 21
Points : 4
Points : 4
J'ai trouvé : il fallait faire un double foreach.
Code :
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);
hindioriental est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/10/2011, 10h46   #15
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
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 :
$a = array(array(array_search($item[8], $sort) + 1,$item[1],$item[4],$item[5],$item[6],$item[8]));
__________________
  • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
  • Merci d'utiliser les balises de code (# dans l'éditeur)
  • Si votre problème est réglé, merci d'utiliser le bouton
S.N.A.F.U
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h11.


 
 
 
 
Partenaires

Hébergement Web