Utilisation de la fonction max

Eléphant du PHP | 92 Messages

22 juin 2005, 10:12

D'accord la fonction file Lit le fichier et renvoie le résultat dans un tableau .
Mais lorsque je lance le programme il me met une erreur sur le premier foreach donc je ne comprend pas car normalement si je comprend le mécanisme il devrait prendre toutes les valeurs que j'ai dans mes fichiers texte et les mettre toute dans la variable $nom.
je coince.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

22 juin 2005, 10:17

Tu as pas tout a fait saisi mon algo

au début du script, je crée la liste des fichiers à explorer ($a_fichier) ensuite, le 1er foreach me permet de parcourir ces fichier afin de tous les explorer.

Ensuite, j'utilise file() sur chaque fichier afin de récupérer le contenu de ce fichier dans un tableau ($a_file)

Ensuite je parcours ce tableau ligne par ligne (ou case par case, comme tu préfère) et pour chaque ligne je la sépare selon les espace avec explode() afin de récupérér dans le tableau $a_ligne les 3 colonnes qui composent ta ligne $a_ligne[0] contient la 1ere colonne, $a_ligne[1] la 2eme et $a_ligne[2] la 3eme.

Ensuite je teste si le contenu de la 3eme colonne ($a_ligne[2]) est supérieur à toutes les valeurs testée et si c'est le cas, je mémorise cette valeur et la ligne

mon 1er foreach me permet juste de naviguer dans le tableau qui contient les noms des fichiers

Si tu as une erreur, c'est peu être parce que tu n'as pas modifié $a_fichier en mettant le nom de TES fichiers à explorer
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 92 Messages

22 juin 2005, 10:22

dans $a_fichier j'ai bien mis le nom de mes fichiers exemple :
moy_8h_hier_O3_prev.txt.
Une question ne faut-il pas des ; apres $chemin et $a_file car l'erreur qu'il me met est parse error donc en général c'est une erreur de syntaxe,non ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

22 juin 2005, 10:25

Tu as entièrement raison. :pouce:

Très bonne analyse du message d'erreur :agenouille:

J'ai oublié un ; à la fin de ces lignes :
$chemin = "fichiers"
$a_file = file($chemin."/".$nom)
Code corrigé :
//Tout met tout les noms de tes fichiers ici
$a_fichier = array(
"nom_fichier1.txt",
"nom_fichier2.txt");

//Cette variable va mémoriser le max de tous les fichiers
$max = -1;

//Cette variable contient le chemin d'acces jusqu'au répertoire qui contient les fichiers textes
$chemin = "fichiers";

//Permet de parcourir les noms de fichiers
foreach($a_fichier as $nom) {
    //Met le contenu du fichier désigné par $nom dans fichier. une ligne par case
    $a_file = file($chemin."/".$nom);
    
    //Permet de parcourir chque ligne du tableau
    foreach($a_file as $ligne) {
        //Découpe la ligne selon les espaces et met le résultats dans un tableau
        $a_ligne = explode(" ", $ligne);
        
        //On teste si la valeur de la 3eme colonne est supérieure à la valeur stockée
        if ($a_ligne[2] > $max) {
            $max = $a_ligne[2];
            $ligne_max = $ligne;    
        }
    }
}
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 92 Messages

22 juin 2005, 10:30

Merci pour tes corrections une dernière question (en espérant que ce soit la dernière) une fois ce programme lancer est-ce que je peux écrire cela :

$fp = fopen(REPERTOIRE_DONNEES_SORTIE_O3.max_hier_8h,"w");

fputs($fp,$a_ligne[0]."\t".$a_ligne[1]."\t".$ligne_max ."\r\n");

afin créer un fichier ayant la même structure que mes fichiers de base c'est-à-dire mes coordonnées puis mes valeurs maximum.

Merci

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

22 juin 2005, 10:39

Bien sûr !!!!

Mais quelques précisions :

fopen(nom_ficher, "w") => le w permet d'ouvrir le fichier (création si existe pas) mais écrase le contenu précédent si il existait déjà

Si tu veux ajouter à la suite, utilise plutot "a"

fputs($fp,$a_ligne[0]."\t".$a_ligne[1]."\t".$ligne_max ."\r\n"); => cette ligne va écrire dans le fichier texte :
val_X val_Y val_X val_Y val_max

parce que $ligne_max contient la ligne dont val_max est la plus grande
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 92 Messages

22 juin 2005, 10:51

donc je n'ai pas besoin de mettre $a_ligne[0]."\t".$a_ligne[1]."\t".

je met juste $ligne_max ainsi j'aurais mes coordonnées puis mes max.

Malheuresement j'ai encore un petit souci, je m'explique mon programme entier récupère au début des données sur internet puis fait différents calculs notamment celui de calculer mes max.
Ce programme est lancé une fois par jour en tâche planifiée par l'intermédiaire d'un fichier .BAT et losque le l'exécute deux erreurs apparaissent :
la première : invalid argument supplied for foreach<> (faut-il cocher une option dans php pour enlever cette erreur).
la seconde file le nom de mes fichiers text failed to open streal.

Et la je ne comprend pas pourquoi ces deux erreurs.
as-tu une solution
et encore merci pour ton aide

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

22 juin 2005, 10:58

La 1ere erreur doit être parce que tu as mal formaté ton tableau $a_fichier, il me faudrait le code de création de ton tableau pour t'en dire plus

la 2eme signifie qu'il n'arrive pas à ouvrir le fichier que tu lui donnes. Est-ce que tu as changé ton argument $chemin ?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 92 Messages

22 juin 2005, 11:03

voici le code qui me crée mes fichiers texte (je t'en mets q'un morceau car les mêmes lignes de commande se répètent) il compose en deux partie car j'ai fait une fonction puis j'appelle cette fonction:

la fonction :

function calcul_moyenne_8h_prevair($Cx,$nb_points,$coord,$polluant)
{

$fp = fopen(REPERTOIRE_DONNEES_SORTIE_O3."moy_8h_hier_".$polluant."_prev.txt","w");
for($i=0;$i<$nb_points;$i++)
{
$moyenne=0;
for ($j=0; $j<8; $j++)//calcul de la moyenne 8H hier au point i
{
$moyenne=$moyenne+$Cx[$j][$i];
}
$moyenne=$moyenne/8;
fputs($fp,$coord[$i][0]."\t".$coord[$i][1]."\t".$moyenne."\r\n");
}
fclose($fp);


$fp = fopen(REPERTOIRE_DONNEES_SORTIE_O3."moy_9h_hier_".$polluant."_prev.txt","w");
for($i=0;$i<$nb_points;$i++)
{
$moyenne=0;
for ($j=1; $j<9; $j++)//calcul de la moyenne 9H hier au point i
{
$moyenne=$moyenne+$Cx[$j][$i];
}
$moyenne=$moyenne/8;
fputs($fp,$coord[$i][0]."\t".$coord[$i][1]."\t".$moyenne."\r\n");
}
fclose($fp);


Ligne de commande où j'apelle ma fonction :

//extraction des valeurs toutes les 8 heures
calcul_moyenne_8h_prevair($Cx,$nb_points,$coord,"O3");


Je te met également la ligne correspondant à $chemin :

$chemin = "c:/PREVAIR/CARTE/O3" ;


Merci pour ton aide.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

22 juin 2005, 11:06

2 points
- utilise les balise PHP quand tu pose du code, c'est plus lisible
- donne moi le code que je t'ai donné pour que je vois comment tu l'a modifié
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 92 Messages

22 juin 2005, 11:22

j'ai réussi à résoudre les deux erreurs (j'avais une petite faute de syntaxe).
Dernière petite chose et je ne t'embête plus, j'ai encore un petit souci pour la création du fichier txt dans lequel je souhaite récupérer mes valeurs voilà ma ligne de commande :


//Tu mets tout les noms de tes fichiers ici
$a_fichier = array(
"moy_8h_hier_O3_prev.txt",
"moy_9h_hier_O3_prev.txt");

//Cette variable va mémoriser le max de tous les fichiers
$max = -1;

//Cette variable contient le chemin d'acces jusqu'au répertoire qui contient les fichiers textes
$chemin = "C:\PREVAIR\CARTES\O3" ;

//Permet de parcourir les noms de fichiers
foreach($a_fichier as $moy_8h) {

//Met le contenu du fichier désigné par $moy_8h dans fichier. une ligne par case
$a_file = file($chemin."/".$moy_8h);

//Permet de parcourir chque ligne du tableau
foreach($a_file as $ligne) {
//Découpe la ligne selon les espaces et met le résultats dans un tableau
$a_ligne = explode(" ", $ligne);

//On teste si la valeur de la 3eme colonne est supérieure à la valeur stockée
if ($a_ligne[2] > $max) {
$max = $a_ligne[2];
$ligne_max = $ligne;
}
}
}
$fp = fopen(REPERTOIRE_DONNEES_SORTIE_O3.$max_hier_8h.txt,"w");
fputs($fp,$ligne_max ."\r\n");

je te mets également le code que tu m'as fournis avec les modifs que j'ai faite.

Merci beaucoup. Ton aide m'a été très précieuse.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

22 juin 2005, 11:26

Il faut mettre le nom du fichier entre "

$fp = fopen("REPERTOIRE_DONNEES_SORTIE_O3".$max."_hier_8h.txt","w");

Sinon,

Utilise les balises
 et [code] (au dessus de la zone de saisie + racourcis clavier correspondants)

Ca conserve l'indentation et ça permet la coloration syntaxique et ça facilite la lecture du code[/color]
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 92 Messages

22 juin 2005, 11:44

Ok promis j'utiliserais les balise PHP afin de colorer mon code.
Dernière question.... la création de fichier txt final fonctionne mais il ne met pas mes valeurs à l'intérieur. Je ne comprend pas ?
j'ai fait plusieurs essais et pas de résultat...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

22 juin 2005, 11:47

essaye ce code
$fp = fopen(REPERTOIRE_DONNEES_SORTIE_O3.$max_hier_8h.txt,"w") or die("Impossible de créer ou d'ouvrir le fichier"); 
fputs($fp,$ligne_max ."\r\n") or die("Impossible d'écrire dans le fichier"); 
Et dit moi si ça a changé quelquechose
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 92 Messages

22 juin 2005, 12:10

çà ne change rien, la création du fichier se fait mais rien ne se met dedans....