exploitation de données depuis un fichier texte

Eléphant du PHP | 250 Messages

20 janv. 2010, 22:11

Bonsoir !
Alors je poste ici comme on me l'a dit 8-)
$tab_array=file("nouveau_loto.txt");
//Fichier contient données, transformé en array
$nbvals=count($tab_array);
//compte le nb de données
echo 'nombre de valeurs: '.$nbvals.'<br>';
$tab_string=implode("",$tab_array);(1)
//converti tab en string
//on retire les caractères -+
$a_remplacer=array("-","+");
$correction = str_replace($a_remplacer, "" , $tab_string);
$tab[]=array("$correction"=>"$tab_string");
Ben en faites, mon nouveau script est différent des anciens sur la maitrise des nombres aléatoires car ici tout les tirages sont déjà dans le fichier nouveau_loto.txt.
Donc ce que j'ai commencé à faire, c'est de lire le contenu du fichier qui dispose de 202 entrées au format x-x-x-x-x+x ou chaque x est 1 nombre compris entre 1 & 49 numéros.
Mon projet, est de réaliser un tri avec le contenu formaté du fichier qui contient les dits tirages.
Comme je ne sais pas faire de manipulation de string dans un tableau, pour retirer "-" et "+", j'ai converti (1) en string mon tableau qui contient mes tirages, ça m'a permise d'utiliser la fonction str_replace pr supprimer "-" et "+".
Mais après je voudrais assigné dans un nouveau tableau en chaque indices $correction avec chaque valeurs $tab_string. Car je pense que de cette façon, ça sera plus facile à traiter avec les conditions IF qui me permettra de savoir par exemple quelle est la chaine x-x-x-x-x+x qui est la plus tirées par exemple, donc ça voudra dire qu'il faudra que je compte les doublons.

J'espère que c'est compréhensible :lol:
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.

Eléphant du PHP | 250 Messages

20 janv. 2010, 22:38

Je vais essayé d'être plus explicite :
$tab_array=file("nouveau_loto.txt");
print_r($tab_array);
ça donne ça :
Array
(
[0] => 7-8-22-28-38+10

[1] => 3-21-32-33-38+10

[2] => 4-7-14-31-37+8

[3] => 6-20-24-31-36+4

etc jusqu'a 202...
Tandis que là j'ai :
$a_remplacer=array("-","+");
$correction = str_replace($a_remplacer, "" , $tab_string);
$new_tab[]=$correction;

print_r($new_tab);
Array
(
[0] => 7822283810
32132333810
471431378
évidemment je voudrais que ça ressemble comme dans mon tableau brut en haut mais avec mes valeurs nettoyées ! Ya un truc qui m'échappe. :roll:
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.

Eléphant du PHP | 63 Messages

20 janv. 2010, 22:44

Je ne comprend pas, tu veux convertir ça :
Array
(
[0] => 7-8-22-28-38+10
[1] => 3-21-32-33-38+10
[2] => 4-7-14-31-37+8
[3] => 6-20-24-31-36+4
...
En ça :
Array
(
[0] => 7822283810
[1] => 32132333810
[2] => 471431378
[3] => 6202431364
...
Car là, je ne comprend pas un traitre mot de ta problématique. Désolé.

ViPHP
AB
ViPHP | 5818 Messages

20 janv. 2010, 22:48

Bah, à quoi sert ta conversion ? pourquoi tu ne travaille pas directement sur ton tableau ?


EDIT : au fait comment enregistre tu les données dans ton fichier texte ? Tu utilises quelle fonction ? Tu enregistres en une fois ou en plusieurs fois ? Il y a des méthodes plus ou moins fiables.
Modifié en dernier par AB le 20 janv. 2010, 23:47, modifié 1 fois.

Eléphant du PHP | 250 Messages

20 janv. 2010, 22:56

oui voilà :wink:
Alors j'ai pensé faire comme ça:
$a_remplacer=array("-","+");
$correction = str_replace($a_remplacer, "" , $tab_string);
$new_tab=str_split($correction,10);
Mais ça me donne ça :
Array
(
[0] => 7822283810
[1] =>
32132333
[2] => 810
47143
[3] => 1378
6202
[4] => 431364
41
C'est bizarre, c'est vrai que la longueur des chaînes ne fait pas toujours 10 caractères.

Je n'enregistre rien avec mon script, je lis le fichiers et je fait un tri visuel seulement.
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

20 janv. 2010, 23:03

Et alors, tu n'a pas répondu à mes questions, ni dit pourquoi ma proposition ne te convient pas...

Par ailleurs, si tu lis un fichier texte, il a bien été enregistré d'une manière ou d'une autre...

Eléphant du PHP | 250 Messages

20 janv. 2010, 23:22

Et alors, tu n'a pas répondu à mes questions, ni dit pourquoi ma proposition ne te convient pas...

Par ailleurs, si tu lis un fichier texte, il a bien été enregistré d'une manière ou d'une autre...
Mais le fichier texte ne vient pas de moi ! juste de la Francaise des Jeux !!! et donc je veux juste l'évaluer en mettant différentes conditions dessus et savoir ce qui peut en ressortir comme résultat de la chaine qui est sortie la plus, celle la moins, celle qui contient plus de nombre pair ou impair, enfin bref, mais c'est pas le soucis.

Je m'intéresse pas à ta proposition car, c'est pas le soucis que j'ai pour l'instant.
Je veux réalisé ça comme ooflorent l'avait saisi :wink: :
Array
(
[0] => 7822283810
[1] => 32132333810
[2] => 471431378
[3] => 6202431364
Peut être que je me complique a ma façon certes, que je ne suit pas une bonne logique à mon raisonnement et que j'ai les mains dans le cambouis.
Pour moi c'était nécessaire de retirer les - et + qui séparent les nombres pour pouvoir manipuler la chaine x x x x x x et la comparé à la chaine y y y y y y pour identifier par exemple un double. Mais peut être que je pouvais travaillé avec x-x-x-x-x+x et y-y-y-y-y+y et enlever au résultat les séparations - et + que je ne veux pas(mais ça c'est juste une question d'affichage)
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

21 janv. 2010, 00:23

Ben faudrait faire ton remplacement sur chacun des éléments de ton tableau. Et dans ton code je ne vois aucune boucle ni fonction qui travaille sur tous les éléments de ton tableau.

On pourrait utiliser str_replace mais on peut aussi dire qu'on ne veut garder que les valeurs numériques avec par exemple preg_replace('/([^0-9]+)/', '', $value); L'avantage par rapport à un str_replace c'est que même si le formatage de tes numéros venait à changer (par exemple x/x/x/x/x/x+y ou encore x.x.x.x.x.x-y, etc.) ton code continuerait à fonctionner sans avoir à le modifier puisqu'on enlève toutes les valeurs différentes de celles comprises dans l'intervalle qui va de 0 à 9.

En utilisant array_map qui applique une fonction à tous les éléments d'un tableau ça peut donner
function replace_caract($value)
{
$value = preg_replace('/([^0-9]+)/', '', $value);
return $value;
}

$tab_convert = array_map('replace_caract',$tab_array);
ensuite il serait peut être intéressant de trier les éléments de ton tableau
$tab_convert = sort($tab_convert);

ViPHP
AB
ViPHP | 5818 Messages

21 janv. 2010, 04:26

Et pour la petite histoire, avec la méthode "classique" qui consiste à lister les éléments du tableau on pourrait faire
$tab_convert = array();

foreach ($tab_array as value)
{
$tab_convert[] = preg_replace('/([^0-9]+)/', '', $value);
}

//puis pour trier
$tab_convert = sort($tab_convert);

Eléphant du PHP | 250 Messages

21 janv. 2010, 20:52

Bonsoir AB,

J'ai réussie à faire ce que je voulais :
$tab_array_brut=file("nouveau_loto.txt");
//print_r($tab_array_brut);
//Fichier contient données
$nbvals=count($tab_array_brut);
//compte le nb de données
echo 'nombre de valeurs: '.$nbvals.'<br>';

function rempl_caract($val)
{
    $val=preg_replace('/([^0-9]+)/','',$val);
    return $val;
}

$tab_net=array_map('rempl_caract',$tab_array_brut);
sort($tab_net);
echo 'valeur max:'.max($tab_net).'<br/>';
echo 'valeur min:'.min($tab_net).'<br/>';

$tab_net[]='34611311';
//rajout pour vérifier que $tab2 en compte bien 2
$resultat=array_count_values($tab_net);
foreach( $resultat as $cle=>$valeur)
{
    echo $cle."=".$valeur.'<br/>';
    }
nombre de valeurs: 202
valeur max:262931344210
valeur min:12329489
12329489=1
12726449=1
34611311=2
34613418=1
34738462=1
35723487=1
Pour l'utilisation de preg_replace, j'avais essayé, mais je trouve que les expressions étaient compliquées à utilisées.

J'ai essayé de réaliser une fonction et de lui passer en argument $tab_array_brut et qu'elle m'affiche le tableau proprement, mais sans succès j'avais fait un vrai méli-mélo. :roll: Mais j'ai cru lire que était possible de passer un array en argument à une Function.

Je mêle souvent string et tableaux ensemble. Et je viens de comprendre que gettype($valeur); m'est d'une grand utilité pour savoir le type de la variable.
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

22 janv. 2010, 01:22

Y'a une initiation sur les expressions régulières assez abordable ici http://www.siteduzero.com/tutoriel-3-14 ... e-1-2.html

Si tu veux tout faire dans une fonction pourquoi pas mais normalement on fait des fonctions pour remplir une tâche spécifique. Tu pourrais aussi tout regrouper dans une classe. Ou rester comme ça, y'a rien de sale à faire comme tu as fait.

Sinon tu pourrais faire aussi une fonction de traitement et une partie d'affichage ce qui te permettrait de n'appeler que la fonction d'affichage dans ton code html
<?php
// Fonction qui traite un tableau en renvoyant des valeurs composées uniquement de chiffres
function Retourne_chiffre($tab)
{
	$tab_convert = array();
	
	if (is_array($tab))
	{
		foreach ($tab as $value)
		{
		$tab_convert[] = preg_replace('/([^0-9]+)/', '', $value);
		}
	}
	
return $tab_convert;
}


// Affichage des valeurs du loto
function Affiche_loto($tab)
{
	if (is_array($tab))
	{	
		//tri
		sort($tab);
	
		echo 'valeur max:'.max($tab).'<br/>';
		echo 'valeur min:'.min($tab).'<br/>';
		
		$resultat = array_count_values($tab);
			
		foreach( $resultat as $cle=>$valeur)
		{
			echo $cle."=".$valeur.'<br/>';
		}
	}
}


$tab_array_brut=file("nouveau_loto.txt");

$tab_loto = Retourne_chiffre($tab_array_brut);

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>On a gagné !</title>

</head>

<body>

<div>
<?php Affiche_loto($tab_loto);?>
</div>

</body>
</html>
Mieux vaut utiliser var_dump() pour des infos sur une variables.

Eléphant du PHP | 250 Messages

22 janv. 2010, 15:06

Merci pour le lien, je crois que je vais remplacer les pages de mon livres avec...

Réalisé 2 fonctions séparées pour faire le boulot, ya pas trop de soucis à se faire c'est assez simple et compréhensible.

Mais ne j'avais pas fait comme ça :

Function Retourne_chiffre($tab)
{ 1ère fonction

Function affichahe($tab)
2ème fonction
}
}
Je les avaient imbriquées. Hors autant faire une class qui contient toutes les fonctions séparées. Mais bon la poo c'est pas pour maintenant... #-o
Je cherche toujours midi à 14h00 à mon niveau ! :mrgreen:
Merci AB :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
AB
ViPHP | 5818 Messages

22 janv. 2010, 16:34

Tu voulais faire sans doute comme ça
function Retourne_chiffres($value)
{
$value = preg_replace('/([^0-9]+)/', '', $value);
return $value;
}


function Affiche_tri_loto($tab)
{
	if (is_array($tab))
	{	
		//tranforme les valeurs en nombres
		$tab = array_map('Retourne_chiffres',$tab);
		
		//tri
		sort($tab);
	
		echo 'valeur max:'.max($tab).'<br/>';
		echo 'valeur min:'.min($tab).'<br/>';
		
		$resultat = array_count_values($tab);
			
		foreach( $resultat as $cle=>$valeur)
		{
			echo $cle."=".$valeur.'<br/>';
		}
	}
}


Affiche_tri_loto($tab_array);
D'ailleurs c'est même mieux puisque tu pourrais te servir éventuellement par la suite de la fonction "Retourne_chiffres" pas uniquement sur des tableaux. C'est plus dans l'esprit POO effectivement :wink:

Sans rien changer on peut faire une classe basique
class loto
{
	private function Retourne_chiffres($value)
	{
	$value = preg_replace('/([^0-9]+)/', '', $value);
	return $value;
	}
	
	
	public function Affiche_tri_loto($tab)
	{
		if (is_array($tab))
		{	
			//tranforme les valeurs en nombres
			$tab = array_map('Retourne_chiffres',$tab);
			
			//tri
			sort($tab);
		
			echo 'valeur max:'.max($tab).'<br/>';
			echo 'valeur min:'.min($tab).'<br/>';
			
			$resultat = array_count_values($tab);
				
			foreach( $resultat as $cle=>$valeur)
			{
				echo $cle."=".$valeur.'<br/>';
			}
		}
	}
}

$tri = new loto;
$tri -> Affiche_tri_loto($tab_array);
Bon dans ce cas ça n'apporte rien par rapport aux fonctions séparées, si ce n'est de ranger tes fonctions dans un ensemble.

Alors c'est résolu ?

Eléphant du PHP | 250 Messages

22 janv. 2010, 19:53

oui, c'est ce que j'avais plutôt essayer de faire, appeler un fonction à l'intérieur d'une fonction.
Mais ça ne marchait pas, je pensais que la fonction externe n'était pas accessible, comme certaine variables externes ou il faut rajouter Global pour pouvoir les utiliser dans la fonction.

Mais apparement, je faisais erreur :roll:

Là je suis en plein Regex, c'est comme la POO ça, au début ça va, à la fin ça va plus du tout :mrgreen:

Décidément, je comprends pourquoi l'éléphant est bleu.... :|



Merci encore AB
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.

Eléphant du PHP | 250 Messages

28 janv. 2010, 23:38

blop!!!...
Modifié en dernier par diabless6 le 29 janv. 2010, 16:49, modifié 1 fois.
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.