Page 1 sur 1

stocker des valeurs issues d'une boucle dans un tableau uniq

Posté : 22 oct. 2007, 23:41
par choubix
hello,

bon j'ai decortique des exemples qui m'ont ete donnes et je tente ma version perso pour le script de lotto.

dans la boucle suivante je retourne la difference entre la grille gagnante et les grilles qui ont etees jouees entre aujourd'hui et une date passee.

la difference entre les grilles est bien retournee dans le while (il suffit d'afficher $diff pour ca). par contre je galere un peu pour stocker le resultat de chaque iteration dans UN SEUL tableau (qui peut etre treeeeeeees long). apres je voudrais utiliser array_count_values sur ce tableau pour savoir combien j'ai de grilles perdantes et gagnantes a 1, 2, 3, 4, 5 ,6 bons numeros.


comment est ce que je peux faire pour retourner toutes les differences trouvees au sein d'un meme tableau svp?

merci

le code : (avec les bonnes balises ;) )
$query = ("SELECT * FROM grids_clients WHERE timeplayed BETWEEN $dateprevious AND $datecurrent");
$run_query = mysql_query($query) or die('Invalid query: ' . mysql_error());

$counter = mysql_num_rows($run_query);

$i = 0;
while ($i < $counter)
{
$temp_grids = mysql_result($run_query,$i,"grids_1");
$client_grids = strtoArray($temp_grids);

$diff = count(array_diff($client_grids, $draw));

$i++;
}
merci!

Posté : 22 oct. 2007, 23:53
par choubix
bon a faorce de m'acharner DANS la boucle je faisais une belle erreur. la ca marche... :)
while ($i < $counter)
{
$temp_grids = mysql_result($run_query,$i,"grids_1");
$client_grids = strtoArray($temp_grids);

$diff = count(array_diff($client_grids, $draw));
print"$diff<br>";

$array[$i]=$diff;


$i++;
}
$result = array_count_values($array);
print_r($result);

Posté : 22 oct. 2007, 23:54
par Tracker
Salut,


Juste une remarque en passant, le format de stockage le plus pertinent pour le loto, est de stocker les tirages sous la forme d'un unsigned bigint (64bits) -> 49 boules = 49 premiers bits

Tirage ou Pari = somme(de 1 à 6) 2^(numéro boule - 1)

Ensuite pour requêter tu n'as qu'a faire des opérations logiques et utiliser la fonction BIT_COUNT():
En imaginant que X est le pari d'un joueur et Y le tirage:
select BIT_COUNT(X & Y) te donne le nombre de bon numéros.


Tracker.

Posté : 23 oct. 2007, 00:04
par choubix
salut Tracker

je n'en suis pas encore la :(

tu me diras: je me complique certainement la vie a vouloir faire ce script mais bon: au moins ca sera fait! :)

Posté : 23 oct. 2007, 00:18
par Tracker
salut Tracker

je n'en suis pas encore la :(

tu me diras: je me complique certainement la vie a vouloir faire ce script mais bon: au moins ca sera fait! :)
Je dis juste, qu'au lieu de stocker des chaines, ou plusieurs numéros pour définir un tirage ou un pari, il te suffit de stocker un seul bigint. Ca rend les recherches 1000x plus simples et rapides et rend tout le code que tu as posté un peu partout :wink: inutile, parce que le résultat devient trivial en SQL.

Alors réfléchis vite avant de courrir vers les complications...


Tracker.

Posté : 23 oct. 2007, 00:24
par Tracker
Regarde ce code SQL, ça te donnera peut-être des idées:

Code : Tout sélectionner

select BIT_COUNT( (pow(2,4) + pow(2,8) + pow(2,12)) -- pari 4/8/12 & (pow(2,3) + pow(2,8) + pow(2,17)) -- tirage 3/8/17 ) as r -- r = un bon numéro

Tracker.

Posté : 23 oct. 2007, 00:44
par choubix
si tu crois m'impressionner ces 3 lignes de code et bien... t'as peut etre raison! ;)

quand je vois le nombre de personnes qu'il a fallu, le temps passe dessus...

enfin: au moins j'ai reussi a le reecrire a force de lire le code et les explications qui m'ont ete donnees au fur et a mesure!

ca ressemble a ca:
$query = ("SELECT * FROM grids_clients WHERE timeplayed BETWEEN $dateprevious AND $datecurrent");
$run_query = mysql_query($query) or die('Invalid query: ' . mysql_error());

//initialize counter: used to extract grids played by clients depending on the date 
$counter = mysql_num_rows($run_query);
//print "$counter<br><br><br>";


//loop starts
$i = 0;
while ($i < $counter)
{
$temp_grids = mysql_result($run_query,$i,"grids_1");
$client_grids = strtoArray($temp_grids);

//returns the difference between the lucky draw and the grids played by the client. returns a string
$diff = count(array_diff($client_grids, $draw));
print"$diff<br>";

//store string in an array
$array[$i]=$diff;

$i++;
}

print "<br><br>";

//count the occurences in the array: how many grids with 0, 1, 2, 3, 4, 5, 6 good numbers
$result = array_count_values($array);

//sort the array by KEY 
ksort($result);
//print_r($result);

print"
<table width=\"500\" border=\"0\">
  <tr>
    <td width=\"250\">Winning numbers per grid</td>
    <td width=\"250\">Total winners</td>
  </tr>
</table>";

//loop the array to print the result
foreach ($result as $key => $value) {
//print "$key";
//print "$value<br>"; 
$key2 = 6 - $key;

print"<table width=\"500\" border=\"0\">
	  <tr>
		<td width=\"250\">$key2</td>
		<td width=\"250\">$value</td>
	  </tr>
	</table>
	";

}
par contre j'ai reutilise les fonctions qui m'ont ete donnees telles quelles: il faut que je les relisent afin de comprendre comemnt elles sont faites...



dis moi: ou as tu appris ton SQL? parce que je suis pas contre l'idee de me simplifier la vie (je laisse l'autoflagellation aux autres normalement ;) )
s'il y a de bons tutoriaux en ligne je suis preneur! :)

Posté : 23 oct. 2007, 01:11
par Tracker
dis moi: ou as tu appris ton SQL? parce que je suis pas contre l'idee de me simplifier la vie (je laisse l'autoflagellation aux autres normalement ;) )
s'il y a de bons tutoriaux en ligne je suis preneur! :)
En réalité SQL (l'aspect DQL) c'est une logique de réflexion, tu assembles des tables suivant de contraintes, et des colonnes avec ou sans opérations, pour produire un résultat. La syntaxe est hyper simpliste par contre la logique par accéder au résultat est parfois épineuse.
Je te conseillerai de potasser la doc de MySQL, la partie select / sous select lis bien les exemples qui sont fournis et fais les.
Télécharge un client de connexion à mysql (SQLyog ou autres) ça te simplifiera la vie, monte des structures assez simples (une base de généalogie par exemple), ensuite essaie de répondre à des questions de plus en plus complexes:qui est le père de X, X a-t'il des frères, combien ? X et Y sont-ils cousins, etc...

Pour vraiment capter la logique, il faut en manger :wink:


Tracker.

Posté : 23 oct. 2007, 03:24
par choubix
en effet, la programmation ca n'est pas inne ;)

bon je me pencherai la dessus des que je pourrais. si ca peut me faire gagner du temps par la suite + economiser des lignes de code ca ne peut etre que du bon! :)