IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

utiliser 2 array pour en faire un troisieme


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    particulier
    Inscrit en
    Mai 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : particulier

    Informations forums :
    Inscription : Mai 2020
    Messages : 17
    Par défaut utiliser 2 array pour en faire un troisieme
    bonjour,

    je suis noob en php et en code tout court d'ailleurs. Je me sers de ce langage pour un bloc code sous Jeedom. L'idée est de faire de la prévision de production solaire en tenant compte de l'azimut, de l'altitude et de la couverture nuageuse, tout ca par rapport a l'heure de la journée forcément.
    azimut et altitude sont calculés et me reviennent sous la forme $tableau_az_alt[$i] = array($heure_human_az_ht,$azimuth360_round,$altitude_round)$i est le timestamp correspondant
    la couverture nuageuse est récupérée sur Météorama et revient sous la forme $tableau_couv_nuageuse[$timestamp_couv_nuageuse] = array($j,$valeur_couv_nuageuse)$j est l'heure humaine

    je souhaite obtenir un tableau semblable au 1er mais avec le pourcentage de couverture nuageuse en plus. J'aurais donc sur la même ligne le timestamp, l'heure humaine, l'azimut, l'altitude et la couverture nuageuse.

    comme vous le verrez dans le code, je peux calculer azimut et altitude a n'importe quel timestamp alors que météorama fournit une couverture nuageuse d'une heure a une autre. Il faut donc comparer, comparer et je ne m'en sors pas

    merci de votre aide, voici le code avec diverses essais et non optimisé j'imagine

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    $heure_actuelle = time();
    $heure_actuelle_human = date("H:i:s", $heure_actuelle);
    $heure_pleine_heure_actuelle = getdate($heure_actuelle);
    $scenario->setLog('heure actuelle : '. $heure_actuelle_human . "\n") ;
    $latitude = 47.077363;
    $longitude = 4.553420;
    // récupération des infos du jour
    $sun_info = date_sun_info(strtotime("now"), $latitude, $longitude);
    foreach ($sun_info as $key => $val) {
      $scenario->setLog("$key: " . date("H:i:s", $val) . "\n") ; 
      $scenario->setLog("$key: " . $val . "\n") ;
    }
    unset($key);
    //$scenario->setLog("sunrise " . date("H:i:s", $val) . "\n") ;
    // sauvegarde des infos du jour
    $leve_soleil = $sun_info [sunrise];
    $leve_soleil_human = date("H:i:s", $sun_info [sunrise]);
    $heure_pleine_leve_soleil = getdate($leve_soleil);
    $couche_soleil = $sun_info [sunset];
    $couche_soleil_human = date("H:i:s", $sun_info [sunset]);
    $heure_pleine_couche_soleil = getdate($couche_soleil);
    $zenith_soleil = $sun_info [transit];
    $zenith_soleil_human = date("H:i:s", $sun_info [transit]);  
    $scenario->setLog('\n');
    $heure_en_cours = getdate();
    $heure_pleine_en_cours = $heure_en_cours[hours];
    $time_left_hour = $heure_pleine_couche_soleil[hours] - $heure_pleine_heure_actuelle[hours] -1;
    $scenario->setLog('time left hour '.$time_left_hour);
    /*
    RELEVER ICI LES DONNEES DE METEORAMA A CHAQUE DEBUT D'HEURE
    */
    $scenario->setlog('Relève données Météorama'.'/n');
    If ($time_left_hour > 0) { //s'il reste au moins une plage horaire pour afficher la couverture nuageuse avant #heure_max#
        for ($ii = 1; $ii <= $time_left_hour; $ii=$ii+1) {
            $j = $heure_pleine_heure_actuelle[hours] + $ii;
            $k = $j + 1;
        //$heure_human_couv_nuageuse = date("H:i:s", $heure_pleine_heure_actuelle[hours]); ESSAI INTEGRATION HEURE HUMAINE DANS TABLEAU COUVERTURE NUAGEUSE POUR CONTROLER PLUS FACILEMENT
        //$scenario->setlog($heure_human_couv_nuageuse);
            $value_percent = cmd::byString('#[Météo][meteorama][+'.$ii.'h]#')->execCmd();
            $scenario->setLog('Couverture nuageuse prévue de '.$j.'h à '.$k.'h : '.$value_percent);
     
          	$pos = strpos($value_percent, '%');
     
          	if ($pos !== false) { // caractère % trouvé dans la chaine          
            	$valeur_couv_nuageuse = substr($value_percent, 0, -1); // suppression du caractère '%' à la fin de la valeur
            } else {
              	$valeur_couv_nuageuse = $value_percent; // sinon c'est que la valeur récupérée n'avait pas de '%' on laisse donc telle quelle
            }
     
          	// enregistrement du pourcentage de nuages prévu à l'heure qui arrive pour suivi au niveau d'un graph et comparaison avec la PROD solaire
          	if ($ii == 1) {
            	cmd::byString('#[Solaire][Position Soleil][Couv actuel]#')->event('"'.$valeur_couv_nuageuse.'"');      
            }
            $couv_nuageuse[$j] = $valeur_couv_nuageuse;	
          	$scenario->setLog('la variable $couv_nuageuse '.$j.' vaut '.$valeur_couv_nuageuse);
          	// Mise à jour du virtuel Couverture nuageuse Lacanche avec les informations
          	cmd::byString('#[Solaire][Position Soleil][Couv '.$j.'h-'.$k.'h]#')->event('"'.$valeur_couv_nuageuse.'"');  
            $timestamp_couv_nuageuse = mktime($j, 0, 0);
          	$scenario->setlog('timestamp couverture nuageuse'.$timestamp_couv_nuageuse);
          	$tableau_couv_nuageuse[$timestamp_couv_nuageuse] = array($j,$valeur_couv_nuageuse);
    }	}
     
    // AFFICHER CES PUTAINS DE VALEUR DE $tableau_couv_nuageuse AVEC LA CLE
    foreach($tableau_couv_nuageuse as $key=>$info) {
    	list($drink, $color) = $info;
    	$scenario->setlog($key.'   '.$drink.'   '.$color); 
    }
     
     
     
    //$value_percent = cmd::byString('#[Solaire][meteorama solaire][+'.$i.'h]#')->execCmd();
     
    // boucle de 1h avant lever de soleil à 1h après coucher de soleil qui affiche az et alt toutes les heures
    $scenario->setlog('relève données azimut et hauteur soleil'.'/n');
    for ($i = $leve_soleil-3600; $i <= $couche_soleil+3600; $i=$i+3600) {
        $scenario->setLog('Timestamp -> '.$i);
      	$scenario->setLog('Heure -> '.date("H:i:s", $i));
      	$heure_human_az_ht = date("H:i:s", $i);
      	require_once dirname(__FILE__) . '/../../data/php/user.function.class.php';
    		list($ra,$dec)=userFunction::sunAbsolutePositionDeg($i);
    		list($az, $alt) = userFunction::absoluteToRelativeDeg($i, $ra, $dec, $latitude, $longitude);
    		$alt=$alt+userFunction::correctForRefraction($alt);
    		$az360=$az;
    		if (0 > $az360)  $az360 = $az360 + 360;
     
    		$azimuth360 = $az360;
    		$altitude = $alt;
          	$azimuth360_round = round ($azimuth360,3);
            $altitude_round = round ($altitude,3);
      		$scenario->setlog('azimut -> '.$azimuth360_round);
          	$scenario->setlog('altitude -> '.$altitude_round);
      		/*
      		TROUVER A QUELLE COUVERTURE NUAGEUSE CORRESPOND LE $i EN COURS DE TRAITEMENT
            IL FAUT TROUVER UN MOYEN D'AJOUTER ICI UNE VARIABLE $couverture_nuageuse AU TABLEAU $tableau_couv_nuageuse
      		*/
      		foreach($tableau_couv_nuageuse as $key=>$info) {
    			list($drink, $color) = $info;
              		if ($i >= $key && $i <= ($key + 3600))
                    {
                      $scenario->setlog('c est dans la plage !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!');
                    }
    			$scenario->setlog($i.'     '.$key.'   '.$drink.'   '.$color);
            }
      		// construction d'un tableau d'index timestamp contenant heure humaine, azimut et altitude
      		$tableau_az_alt[$i] = array($heure_human_az_ht,$azimuth360_round,$altitude_round); // $tableau_az_alt[$i] = array($heure_human_az_ht,$azimuth360_round,$altitude_round,$couverture_nuageuse)
            // nombre d'éléments dans le tableau a chaque itération
      		$scenario->setLog('nb ' .count($tableau_az_alt));
    }
    // nombre total d'éléments dans le tableau
    $scenario->setLog('nb ' .count($tableau_az_alt));
     
    // test pour voir s'il reste des choses de la veille dans le tableau
    $scenario->setlog('essai affichage de données 1');
    foreach($tableau_az_alt as $heure_humaine_az_ht){
        //pour chaque élément de $tableau_az_alt crée la variable $element pour l'afficher
        foreach($heure_humaine_az_ht as $element){
          $scenario->setlog($element);
        }
    }
    $scenario->setlog("essai affichage de données 2");
    foreach($tableau_az_alt as $key => $essai){
      	//for ($i=0;$i<=2;$i=$i+1) {        
      $scenario->setlog($key.' '.$essai [0].' '.$essai [1].' '.$essai [2]);
        //}
    }
    $scenario->setlog("essai affichage de données 3");
    foreach($tableau_couv_nuageuse as $key => $essai){
      	//for ($i=0;$i<=2;$i=$i+1) {        
      $scenario->setlog($key.' '.$essai [0].' '.$essai [1]);
        //}
    }

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 344
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 344
    Billets dans le blog
    17
    Par défaut
    azimut et altitude sont calculés et me reviennent sous la forme $tableau_az_alt[$i] = array($heure_human_az_ht,$azimuth360_round,$altitude_round) où $i est le timestamp correspondant
    la couverture nuageuse est récupérée sur Météorama et revient sous la forme $tableau_couv_nuageuse[$timestamp_couv_nuageuse] = array($j,$valeur_couv_nuageuse) où $j est l'heure humaine

    je souhaite obtenir un tableau semblable au 1er mais avec le pourcentage de couverture nuageuse en plus. J'aurais donc sur la même ligne le timestamp, l'heure humaine, l'azimut, l'altitude et la couverture nuageuse.
    Pour résumer, tu veux ajouter à $tableau_az_alt les valeurs de $tableau_couv_nuageuse du même index, c'est bien ça ?

    À l'aveugle (car ton code ne peut pas être exécuté et que tu ne fournis aucun jeu de données de test ), et en espérant que les indexes/clefs sont au mêmes format, ça donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    foreach ($tableau_couv_nuageuse as $timestamp => $entry) {
        // $entry[0] => "heure humaine"
        // $entry[1] => $valeur_couv_nuageuse
        if (!isset($tableau_az_alt[$timestamp])) {
            echo "[Note] Index/clef {$timestamp} non retrouvé dans \$valeur_couv_nuageuse\r\n";
        } else {
            // Ajout de la couverture nuageuse au tableau des azimuts/altitudes selon l'index
            $tableau_az_alt[$timestamp][] = $entry[1];
            echo "[Note] Couverture nuageuse de {$timestamp} ajoutée\r\n";
        }
    }

  3. #3
    Membre averti
    Homme Profil pro
    particulier
    Inscrit en
    Mai 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : particulier

    Informations forums :
    Inscription : Mai 2020
    Messages : 17
    Par défaut
    j'ai du mal m'exprimer encore, j'en suis dsl

    mon code est capable de calculer azimut et altitude a n'importe quel timestamp. Lorsque je lancerais en prod, je choisirais une fréquence de calcul (toutes les minute, 3 minutes ou autre)
    il faut que j'arrive a mettre dans ce même tableau la couverture nuageuse correspondante.

    ce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $scenario->setlog("essai affichage de données 2");
    foreach($tableau_az_alt as $key => $essai){
      	//for ($i=0;$i<=2;$i=$i+1) {        
      $scenario->setlog($key.' '.$essai [0].' '.$essai [1].' '.$essai [2]);
        //}
    }
    me donne :

    [2022-01-09 06:52:10][SCENARIO] essai affichage de données 2
    [2022-01-09 06:52:10][SCENARIO] 1641709575 07:26:15 111.845 -9.389
    [2022-01-09 06:52:10][SCENARIO] 1641713175 08:26:15 122.41 -0.305
    [2022-01-09 06:52:10][SCENARIO] 1641716775 09:26:15 133.764 7.293
    [2022-01-09 06:52:10][SCENARIO] 1641720375 10:26:15 146.217 13.811
    [2022-01-09 06:52:10][SCENARIO] 1641723975 11:26:15 159.849 18.434
    [2022-01-09 06:52:10][SCENARIO] 1641727575 12:26:15 174.393 20.714
    [2022-01-09 06:52:10][SCENARIO] 1641731175 13:26:15 189.227 20.398
    [2022-01-09 06:52:10][SCENARIO] 1641734775 14:26:15 203.599 17.522
    [2022-01-09 06:52:10][SCENARIO] 1641738375 15:26:15 216.96 12.397
    [2022-01-09 06:52:10][SCENARIO] 1641741975 16:26:15 229.135 5.51
    [2022-01-09 06:52:10][SCENARIO] 1641745575 17:26:15 240.272 -2.406

    tandis que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $scenario->setlog("essai affichage de données 3");
    foreach($tableau_couv_nuageuse as $key => $essai){
      	//for ($i=0;$i<=2;$i=$i+1) {        
      $scenario->setlog($key.' '.$essai [0].' '.$essai [1]);
        //}
    }
    me donne :

    [2022-01-09 06:52:10][SCENARIO] essai affichage de données 3
    [2022-01-09 06:52:10][SCENARIO] 1641708000 7 89
    [2022-01-09 06:52:10][SCENARIO] 1641711600 8 100
    [2022-01-09 06:52:10][SCENARIO] 1641715200 9 98
    [2022-01-09 06:52:10][SCENARIO] 1641718800 10 100
    [2022-01-09 06:52:10][SCENARIO] 1641722400 11 100
    [2022-01-09 06:52:10][SCENARIO] 1641726000 12 100
    [2022-01-09 06:52:10][SCENARIO] 1641729600 13 87
    [2022-01-09 06:52:10][SCENARIO] 1641733200 14 100
    [2022-01-09 06:52:10][SCENARIO] 1641736800 15 99
    [2022-01-09 06:52:10][SCENARIO] 1641740400 16 100

    la première ligne de l'affichage de donnée 3 nous apprend que du timestamp 1641708000 au timestamp 1641711600 (de 7h à 8h aujourd'hui en fait), on a une couverture nuageuse de 89%
    le calcul de l'azimut se fait toutes les heures pour facilité pendant les essais, il me faudra le faire plus fréquemment mais c'est facile, çà
    ce que je n'arrive pas a faire, c'est affecter a chaque ligne de donnée 2. Ici, la 1ere ligne de donnée 2 (timestamp 1641709575 et 07:26:15) devrait être affublée de 89% de couverture nuageuse puisque 07:26:15 est bien compris entre 7h et 8h. il y aura par la suite plus de lignes calculées entre 7h et 8h

    suis je plus clair ? (ce n'est pas mon impression)
    quant a fournir des index, ce sont des timestamps qui se créent seuls et pour l’exécution, je ne sais faire çà qu'au travers d'un bloc code Jeedom.....

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 344
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 344
    Billets dans le blog
    17
    Par défaut
    Oui, tu as 2 tableaux dont les clefs ne correspondent pas, et tu veux les joindre.

    On pourrait faire des calculs afin de déterminer quelle ligne du 2nd tableau ajouter au 1er tableau.

    Mais avant tout la question est :

    Pourquoi tes 2 tableaux n'ont pas de données synchronisées ? (c'est-à-dire avec un même timestamp)

    Si tu synchronises tes données alors il suffira d'appliquer le traitement proposé ici => https://www.developpez.net/forums/d2.../#post11800906

Discussions similaires

  1. Utilisation de Bitcoins pour se faire payer ?
    Par jeremm dans le forum E-Commerce
    Réponses: 0
    Dernier message: 19/10/2011, 20h08
  2. Utiliser 2 array pour une boucle foreach()
    Par boubz013 dans le forum Langage
    Réponses: 3
    Dernier message: 13/10/2010, 18h41
  3. Réponses: 2
    Dernier message: 24/01/2008, 13h48
  4. utiliser données texte pour faire des calculs
    Par sarah67 dans le forum Access
    Réponses: 20
    Dernier message: 06/02/2006, 14h09
  5. utilisation de select() pour faire un Tchat
    Par innosang dans le forum Réseau
    Réponses: 30
    Dernier message: 09/11/2005, 16h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo