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

Eléphant du PHP | 250 Messages

29 janv. 2010, 16:04

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
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

ViPHP
ViPHP | 5462 Messages

29 janv. 2010, 16:36

	$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

Eléphant du PHP | 250 Messages

29 janv. 2010, 19:00

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.
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

ViPHP
ViPHP | 5462 Messages

29 janv. 2010, 21:48

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 ?

Eléphant du PHP | 250 Messages

29 janv. 2010, 23:48

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.
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

ViPHP
ViPHP | 5462 Messages

30 janv. 2010, 01:22

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 ) )

Eléphant du PHP | 250 Messages

30 janv. 2010, 17:41

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 ;)
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

ViPHP
AB
ViPHP | 5818 Messages

30 janv. 2010, 18:02

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

ViPHP
ViPHP | 5462 Messages

30 janv. 2010, 18:14

: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...

Eléphant du PHP | 250 Messages

30 janv. 2010, 22:26

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.
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

ViPHP
ViPHP | 5462 Messages

30 janv. 2010, 22:37

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

ViPHP
AB
ViPHP | 5818 Messages

30 janv. 2010, 22:43

@diablesse6 Pour info suite à ton mp, "couteux en ressource" ça veut dire que ça coute beaucoup de temps de calcul :wink:

Eléphant du PHP | 250 Messages

30 janv. 2010, 22:51

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:
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

ViPHP
ViPHP | 5462 Messages

30 janv. 2010, 23:02

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

Eléphant du PHP | 250 Messages

30 janv. 2010, 23:51

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.
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.