Page 1 sur 2

Problème de mise en page pour la sortie de mon tableau

Posté : 29 janv. 2010, 16:04
par diabless6
Bonjour :wink: ,

J'ai modifié mon script ci dessus notamment dans la lecture du fichier, mais sur une nouvelle approche aussi.
Mon fichier texte en lecture n'a pas changer, les données sont les mêmes :
7-8-22-28-38+10
3-21-32-33-38+10
4-7-14-31-37+8
6-20-24-31-36+4
4-14-23-35-46+7
19-31-38-44-49+3
etc...
A la différence, c'est que je veux traiter les données cette fois-ci verticalement : 1) 7-3-4-6-4-19... 2) 8-21-7-20-14-31
etc... 6 colonnes à traiter.

Voici mon nouveau code :
<?php

$fichier = fopen ("nouveau_loto.txt", "r");
$x=1;
while ($x<=filesize("nouveau_loto.txt"))
{
$contenu_du_fichier = fgets ($fichier, filesize("nouveau_loto.txt"));
$modif_fichier = preg_replace('/([-+]+)/', '.', $contenu_du_fichier);

$tab[$x]=explode(".",$modif_fichier);
$x++;
}
fclose ($fichier);

for($b=0;$b<=5;$b++)
{
for($a=1;$a<=205;$a++)
{  //$val=$tab[$a][$b].'<br>';
$list1=$tab[$a][0];
$list2=$tab[$a][1];
$tab1[]=$list1;
$tab2[]=$list2;
}}

$tab_values=array_count_values($tab2);
//sort($tab_values);

foreach ($tab_values as $cle=>$val)
{
    print "[$cle] $val<br>";
}

//print_r($tab1);
?>
$list1=$tab[$a][0];
$tab1[]=$list1;
Affiche :
[8] 42
[21] 60
[7] 36
[20] 96
[14] 60
[31] 30
[17] 36
[5] 84
C'est ce que je veux, ya pas de soucis. idem pour la colonne $list2=$tab[$a][1];et les autres: [2];[3];[4];[5] que je n'ai pas rajouter ici pour cause d'affichage.

J'ai réalisé une boucle for($b=0;$b<=5;$b++) sur $val=$tab[$a][$b].'<br>'; pour m'éviter d'écrire les 6 références au dessus [0] à [5]
Hors, c'est pas vraiment ce que je veux enfin pour la boucle oui, pour l'affichage non.
Je voudrais que mes 5 colonnes s'affiches simultanément et surtout séparément. En clair, la colonne [0] s'affiche, puis à coté la colonne [1]....etc

Mais je ne vois pas trop comment faire. Ensuite je souhaiterai rajouter la somme à la fin de chaque colonnes du résultat que j'ai obtenu avec la fonction array_count_values ex: 42+60+36...84=xxx
Dailleurs, on remarque que je peux faire qu'1 array_count_values sur qu'une colonne, j'aurai une idée de mettre une boucle sur le array_count_values avec une condition pour que l'affichage passe à la colonne suivante jusqu'a [5].

C'est compliqué, je n'arrive pas à organiser mon code. J'ai le résultat que je souhaitais. Mais l'affichage me pose problème.

Merci

Re: Problème de mise en page pour la sortie de mon tableau

Posté : 29 janv. 2010, 16:36
par stealth35
	$data 	= file('data.txt');
	$array 	= array();
	
	foreach($data as $item)
	{
		$line = preg_split('/[-\+]/', preg_replace('/\s+/', '', $item));
		
		$fill = array_map('chr', array_keys($line));
		$line = array_combine($fill, $line);	
		
		$array = array_merge_recursive($array, $line);	
	}
	
	$array = array_combine(array_flip(array_keys($array)), $array);
	
	//print_r($array);
pourquoi j'utilise array_map('chr'); ?

parce que array_merge_recursive, ne marche que sur les clefs de type string

Re: Problème de mise en page pour la sortie de mon tableau

Posté : 29 janv. 2010, 19:00
par diabless6
ouai. Ta façon de faire est intéressante, néanmoins je la trouve avancée à mon niveau. Ceci dit, elle mérite réflexion.

J'ai modifié légèrement sinon ça ne marchais pas :

J'ai rajouté dans la boucle Foreach
$array = array_combine(array_flip(array_keys($array)), $array);
		$arrayR=array_count_values($array);
        }

foreach( $arrayR as $cle=>$val)
{
    echo "Total de [$cle] dans les six colonnes : $val <br>";
}
Ce qui me donne :
Total de [7] dans les six colonnes : 46
Total de [8] dans les six colonnes : 37
Total de [22] dans les six colonnes : 30
Total de [28] dans les six colonnes : 24
Total de [38] dans les six colonnes : 27
Total de [10] dans les six colonnes : 41
Total de [3] dans les six colonnes : 44
etc...
Seulement c'est le résultat de la globalité des 6 colonnes. Moi je voudrais le résultat indépendant attribué pour chaque colonne. En clair, je voudrais que mes 6 colonnes s'affichent:
colonne 0: total de 8 = 37 , total de 22 = 30 etc...
colonne 1: total de 8=20 , total de 22=15 etc...
colonne 2 puis 3 à 5.

Seulement j'ai l'impression que c'est impossible. j'avais même penser à ça :
foreach ($array as $cle=>$val)
{echo $cle[0]:$val.' '.$cle[1]:$val.' '.$cle[2]:$val .....}
C'est faux, mais j'aurai eux mes 6 colonnes qui s'affichent simultanément sans être mélangées.

Re: Problème de mise en page pour la sortie de mon tableau

Posté : 29 janv. 2010, 21:48
par stealth35
c'est pas que ca ne marche pas c'est que tu ne parcours pas bien ton tableau.

Et la pareil pas besion de boucle un simple :
print_r(array_map('array_count_values', $array));
suffira, sinon sur quoi tu bloque sur ma methode ?

Re: Problème de mise en page pour la sortie de mon tableau

Posté : 29 janv. 2010, 23:48
par diabless6
le print_r sert à afficher des informations à propos d'une variable pour un déguggage je crois.

oui ça marche comme ça, mais c'est pas légitime d'utiliser un print_r pour l'affichage.

Autrement j'ai bloqué sur : $array = array_combine(array_flip(array_keys($array))

C'est l'imbrication qui me bloque, c'est un concept pas très féminin ça. Et je peine à imbriquer ces fonctions.

J'aimerai comprendre le raisonnement suivi pour imbriquer des fonctions entres elles.

Re: Problème de mise en page pour la sortie de mon tableau

Posté : 30 janv. 2010, 01:22
par stealth35
oui, pour le print_r comme ca tu vois comment bien visualisé ton array pour la parcourir apres

je te commente le code
$data   = file('data.txt'); // file creer un array avec pour chaque ligne une entrée (ex: $data[0] = la premiere ligne du fichier)
$array  = array();

foreach($data as $item) //on parcoure notre fichier ligne par ligne
{
        $line = preg_split('/[-\+]/', preg_replace('/\s+/', '', $item)); //on creer un tableau en coupant via les - ou + ,  et on surprime les fins de ligne
       
       //array_merge_recursive ne marche qu'avec des clefs de type (string) or la on a (0 => 12, 1 => 7 ....)
        $fill = array_map('chr', array_keys($line)); // donc on creer une liste de clefs avec autant de caratere ascii que d'entré dans le tableau (ex : 0 => a, 1 => b...)
        $line = array_combine($fill, $line);   //on combine les clef avec les valeurs (ex : a => 12, b => 7)
       
        $array = array_merge_recursive($array, $line); // on merge avec la recursivité, (ex :a chaque clef "a" il va creer une entré)
}
// le probleme est que notre tableau a des clefs de type (string), ducoup on recuprer les clefs (ex : 0 => a, 1 => b) on inverse ducoup (a => 0, b => 1)
//on a maintenant nos clef de type (int) on combine avec les valeurs
$array = array_combine(array_flip(array_keys($array)), $array);

//print_r($array);

Code : Tout sélectionner

Array ( [0] => 7-8-38+10 [1] => 3-21-38+10 ) Array ( [0] => 7 [1] => 8 [2] => 38 [3] => 10 ) Array ( [�] => 7 [] => 8 [] => 38 [] => 10 ) Array ( [0] => 3 [1] => 21 [2] => 38 [3] => 10 ) Array ( [�] => 3 [] => 21 [] => 38 [] => 10 ) Array ( [�] => Array ( [0] => 7 [1] => 3 ) [] => Array ( [0] => 8 [1] => 21 ) [] => Array ( [0] => 38 [1] => 38 ) [] => Array ( [0] => 10 [1] => 10 ) ) Array ( [0] => Array ( [0] => 7 [1] => 3 ) [1] => Array ( [0] => 8 [1] => 21 ) [2] => Array ( [0] => 38 [1] => 38 ) [3] => Array ( [0] => 10 [1] => 10 ) )

Re: Problème de mise en page pour la sortie de mon tableau

Posté : 30 janv. 2010, 17:41
par diabless6
Ce que j'ai saisie, on part du tableau d'origine, on examine sa structure et on réalise un filtre avec le choix d'une fonction étape par étape.

Merci pour ton aide ;)

Re: Problème de mise en page pour la sortie de mon tableau

Posté : 30 janv. 2010, 18:02
par AB
ouai. Ta façon de faire est intéressante, néanmoins je la trouve avancée à mon niveau. Ceci dit, elle mérite réflexion.
Oui y'a du très bon (le début) et du très compliqué (la suite) dont on se demande la nécessité #-o #-o #-o

C'est vrai que dans les précédents topic je voulais t'apprendre quelques fonctions de tableaux, mais là, c'est du grandiose, niveau artistique ça touche au sublime :mrgreen:

Parce que je vois pas la différence de résultat entre les ces deux façons de faire :
$data   = file('data.txt');


$test  = array();
		
       foreach($data as $item)
        {
            $line = preg_split('/[-\+]/', preg_replace('/\s+/', '', $item));
				
			foreach ($line as $key => $value)
				{
				     $test[$key][] = $value;
				} 
        }

echo '<pre>';echo 'test = ';
print_r($test);
echo '</pre>';



$array  = array();


       foreach($data as $item)
        {
            $line = preg_split('/[-\+]/', preg_replace('/\s+/', '', $item));
			
            $fill = array_map('chr', array_keys($line));
            $line = array_combine($fill, $line);   
               
            $array = array_merge_recursive($array, $line); 
        }
		
	$array = array_combine(array_flip(array_keys($array)), $array);

     
echo '<pre>';echo 'array = ';
print_r($array);
echo '</pre>';
Par contre niveau performances, plus tes entrées $data seront grandes, plus la différence de traitement entre les deux façons de faire sera importante. Sur quelques entrées cela ne varie "que du simple au double" par contre pour m'amuser j'ai fait un test sur 3 000 entrées, la deuxième solution n'est que 234 fois plus lente que la première, une broutille :mrgreen:

Comme quoi la simplicité peut payer, ou alors y'a un truc qui m'échappe :-k

Re: Problème de mise en page pour la sortie de mon tableau

Posté : 30 janv. 2010, 18:14
par stealth35
:mrgreen:

ouai je sais pas j'ai un bloquage sur les boucles imbriqué. Et être trop a fond sur toute les fonction array ca n'a pas que du bon ducoup...

Re: Problème de mise en page pour la sortie de mon tableau

Posté : 30 janv. 2010, 22:26
par diabless6
Je suis sauvée Dieu merci. J'ai quand même un bon 6ème sens non ?! :P

Moi j'ai un blocage dans les imbrications de fonctions :mrgreen:

j'ai une préfèrence pour les boucles car je suis une fille.... :twisted:

Niveau performance: un test avec le microtime c'est ça ? Comment on évalue ce genre de chose ? C'est intéressant de savoir ça car ça permet de choisir la méthode la moins lourdes et la plus rapide pour programmer.

Re: Problème de mise en page pour la sortie de mon tableau

Posté : 30 janv. 2010, 22:37
par stealth35
héhé, en plus le plus drole c'est que

array_combine(array_flip(array_keys($array)), $array) == array_values($data)

#-o #-o #-o #-o

sinon pour microtime ouai

tu fais : $time = microtime(); en debut de code

apres a chaque bench tu feras

echo microtime() - $time;


sinon ta des extension comme xdebug qui te font ca plus simplement et proprement

Re: Problème de mise en page pour la sortie de mon tableau

Posté : 30 janv. 2010, 22:43
par AB
@diablesse6 Pour info suite à ton mp, "couteux en ressource" ça veut dire que ça coute beaucoup de temps de calcul :wink:

Re: Problème de mise en page pour la sortie de mon tableau

Posté : 30 janv. 2010, 22:51
par diabless6
Ben ça me fait des chiffres incompréhensible et très aléatoires : 0.0073979999999999 ou 0.01789 micro-secondes

Faut vraiment avoir quelques choses de lourd à traiter pour s'apercevoir d'une différence.
foreach ($line as $key => $value)
                                {
                                     $test[$key][] = $value;
                                } 
C'est ce que je cherchais à faire précédemment, je met sous le coude :wink:
Merci à vous 2 :wink:

Re: Problème de mise en page pour la sortie de mon tableau

Posté : 30 janv. 2010, 23:02
par stealth35
Ben ça me fait des chiffres incompréhensible et très aléatoires : 0.0073979999999999 ou 0.01789 micro-secondes

Faut vraiment avoir quelques choses de lourd à traiter pour s'apercevoir d'une différence.

Merci à vous 2 :wink:
t'aura jamais les memes chiffres, ca depend de beaucoup de chose derriere, par contre ca sera toujour dans la meme fourette de resultat, le but etant de faire plsu bench et faire la moyenne, mais tu peur voir tout de suite dans ton resultat que le 2eme est environ 2x plus long,
comem disais AB sur peu de volume c'est pas trop grave, mais sur beaucoup (ca montait a presque 300x plus long), un script qui va mettre 10ms sec, mettra 3sec et la c'est pas negligable

Re: Problème de mise en page pour la sortie de mon tableau

Posté : 30 janv. 2010, 23:51
par diabless6
J'ai tout de même un soucis :
 foreach (array_count_values($line) as $key => $value)
                                {
                                   $test[$key][] = $value;
Mon array_count_values ne fonctionne pas, je vois pas ou le mettre ?!?
echo "$key = $value <br/>";
0 = 7
1 = 8
2 = 22
3 = 28
4 = 38
5 = 10
0 = 3
1 = 21
2 = 32
3 = 33
4 = 38
5 = 10
0 = 4
1 = 7
2 = 14
3 = 31
4 = 37
5 = 8
On voit bien là comment le foreach fonctionne.