Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/01/2012, 23h03   #21
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 554
Points : 2 554
Envoyer un message via Skype™ à rawsrc
Est ce les données importées correspondent à quelque chose comme ça :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$data = array(
   'ob1' => array(
               array('date' => '2455925.5', 'ra' => 18.562723816667),
               array('date' => '2455925.5833333', 'ra' => 18.568874305556),
               array('date' => '2455925.6666667', 'ra' => 18.575024322222),
               array('date' => '2455925.75', 'ra' => 18.581173863889)
   ),
   'obj2' => array(
               array('date' => '2455925.5', 'ra' => 17.0694258),
               array('date' => '2455925.5833333', 'ra' => 17.077027372222),
               array('date' => '2455925.6666667', 'ra' => 17.084644177778),
               array('date' => '2455925.75', 'ra' => 17.092276088889)
   ),
   'obj3' => array(
               array('date' => '2455925.5', 'ra' => 20.946099566667),
               array('date' => '2455925.5833333', 'ra' => 20.953030933333),
               array('date' => '2455925.6666667', 'ra' => 20.959959494444),
               array('date' => '2455925.75', 'ra' => 20.96688525)
   )
);
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 23h13   #22
Membre à l'essai
 
Christophe Bresso
Bricoleur
Inscription : septembre 2011
Messages : 32
Détails du profil
Informations personnelles :
Nom : Christophe Bresso

Informations professionnelles :
Activité : Bricoleur

Informations forums :
Inscription : septembre 2011
Messages : 32
Points : 20
Points : 20
Oui, c'est exactement cela
CBresso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 23h18   #23
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 554
Points : 2 554
Envoyer un message via Skype™ à rawsrc
Ok, ensuite tu fais tes mélanges ainsi :
Code :
1
2
3
4
obj1(ligne1) - obj2(ligne1)
obj1(ligne1) - obj3(ligne1)
obj2(ligne1) - obj3(ligne1)
...
Donc quand tu dis :
Citation:
Pour chaque objet1
en relation avec chaque objet2 sauf lui même
Cela veut dire que chaque ligne d'un objet correspond à la même position de ligne dans un autre objet ?
J'ai tout suivi ?
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 23h25   #24
Membre à l'essai
 
Christophe Bresso
Bricoleur
Inscription : septembre 2011
Messages : 32
Détails du profil
Informations personnelles :
Nom : Christophe Bresso

Informations professionnelles :
Activité : Bricoleur

Informations forums :
Inscription : septembre 2011
Messages : 32
Points : 20
Points : 20
Oui, je crois que tu as compris. Ce que je veux dire c'est que à chaque date, les objets ont une position déterminée.
Les données que je récupère, je les agrège, car je ne peux pas les récupérer d'un coup. Je fais une requête pour chaque objet sur une même période, d'où la structure de $data.
'ra' est ce que l'on appelle la 'Right Ascension', une position comme sur un cadran.
CBresso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 23h41   #25
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 554
Points : 2 554
Envoyer un message via Skype™ à rawsrc
ok, je vais y réfléchir et te proposer un truc demain
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 23h45   #26
Membre à l'essai
 
Christophe Bresso
Bricoleur
Inscription : septembre 2011
Messages : 32
Détails du profil
Informations personnelles :
Nom : Christophe Bresso

Informations professionnelles :
Activité : Bricoleur

Informations forums :
Inscription : septembre 2011
Messages : 32
Points : 20
Points : 20
J'allais aussi te proposer une pause, demain faut que je sois d'attaque à 6h00...
CBresso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 01h56   #27
Membre émérite
 
Avatar de vorace
 
Homme
Développeur
Inscription : août 2010
Messages : 587
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur

Informations forums :
Inscription : août 2010
Messages : 587
Points : 861
Points : 861
ce qui nous donne :
Code :
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
$data = array(
   'obj1' => array(
               array('date' => '2455925.5', 'ra' => 18.562723816667),
               array('date' => '2455925.5833333', 'ra' => 18.568874305556),
               array('date' => '2455925.6666667', 'ra' => 18.575024322222),
               array('date' => '2455925.75', 'ra' => 18.581173863889)
   ),
   'obj2' => array(
               array('date' => '2455925.5', 'ra' => 17.0694258),
               array('date' => '2455925.5833333', 'ra' => 17.077027372222),
               array('date' => '2455925.6666667', 'ra' => 17.084644177778),
               array('date' => '2455925.75', 'ra' => 17.092276088889)
   ),
   'obj3' => array(
               array('date' => '2455925.5', 'ra' => 20.946099566667),
               array('date' => '2455925.5833333', 'ra' => 20.953030933333),
               array('date' => '2455925.6666667', 'ra' => 20.959959494444),
               array('date' => '2455925.75', 'ra' => 20.96688525)
   )
);
 
$evenement = array('conj' => array(), 'opp' => array());//avec autant d'evenement
 
foreach($data as $cle0 => $valeur0){
	foreach($data as $cle1 => $valeur1){
		$i = 0;//evenement 'conj'
		$j = 0;//evenement 'opp'
		//...
		if($cle0 != $cle1){
			foreach($valeur0 as $cle2 => $valeur2){
				if(floatval($valeur1[$cle2]['ra']) - floatval($valeur2['ra']) > 0 && floatval($valeur1[$cle2]['ra']) - floatval($valeur2['ra']) < 0.5){
					if($i == 0){//date de début
						$evenement['conj'][] = array('objet1' => $cle0, 'objet2' => $cle1, 'date_debut' => $valeur2['date'], 'date_fin' => $valeur2['date']);
						$k = sizeof($evenement['conj']) - 1;
					}else{
						$evenement['conj'][$k]['date_fin'] = $valeur2['date'];
					}
					$i++;
				}else{ 
					$i == 0;
				}
				if(floatval($valeur1[$cle2]['ra']) - floatval($valeur2['ra']) > 5 && floatval($valeur1[$cle2]['ra']) - floatval($valeur2['ra']) < 6){
					if($j == 0){//date de début
						$evenement['opp'][] = array('objet1' => $cle0, 'objet2' => $cle1, 'date_debut' => $valeur2['date'], 'date_fin' => $valeur2['date']);
						$l = sizeof($evenement['opp']) - 1;
					}else{
						$evenement['opp'][$l]['date_fin'] = $valeur2['date'];
					}
					$j++;
				}else{ 
					$j == 0;
				}
			}
		}
	}
}
__________________
Développeur informatique contrarié...
vorace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 08h37   #28
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 554
Points : 2 554
Envoyer un message via Skype™ à rawsrc
Bonjour,

Après une petite réflexion, je propose ceci :
Code :
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
<?php
 
$data = array(
   'ob1' => array(
               array('date' => '2455925.5', 'ra' => 18.562723816667),
               array('date' => '2455925.5833333', 'ra' => 18.568874305556),
               array('date' => '2455925.6666667', 'ra' => 18.575024322222),
               array('date' => '2455925.75', 'ra' => 18.581173863889)
   ),
   'obj2' => array(
               array('date' => '2455925.5', 'ra' => 17.0694258),
               array('date' => '2455925.5833333', 'ra' => 17.077027372222),
               array('date' => '2455925.6666667', 'ra' => 17.084644177778),
               array('date' => '2455925.75', 'ra' => 17.092276088889)
   ),
   'obj3' => array(
               array('date' => '2455925.5', 'ra' => 20.946099566667),
               array('date' => '2455925.5833333', 'ra' => 20.953030933333),
               array('date' => '2455925.6666667', 'ra' => 20.959959494444),
               array('date' => '2455925.75', 'ra' => 20.96688525)
   )
);
 
$events = array();
 
// genération des combinaisons possibles
// entre tous les objets présents
$objects = array_keys($data);
foreach($objects as $key => $obj) {
   $couples[$obj] = array_slice($objects, $key + 1);
}
array_pop($couples); // retrait du dernier élément sans objets partenaires
 
 
 
// lecture des données des objets correspondants aux seconds membres des couples
$readCouples = function($obj, $row, $date, $ra1) use (&$data, &$couples) {
   foreach($couples[$obj] as $otherObject) {
      $ra2   = $data[$otherObject][$row]['ra'];
      $delta = abs($ra1 - $ra2);
      $event = eventName($delta);
 
      if (false !== $event) {
         // ici pour chaque couple tu vas avoir un évènement ou pas
         $manageEvents($event, $date);
 
      }
   }
};
 
 
$manageEvents = function($event, $date) use (&$events) {
   // ici tu parcours ton tableau des évènements et tu les classes date_start/date_end...
 
};
 
 
// POINT D'ENTREE PRINCIPAL DE LA ROUTINE
// parcours des combinaisons et gestion des évènements
foreach($data as $obj => &$details) {
   $nb = count($details);
   foreach($details as $row => $values) {
      $date = $values['date'];
      $ra1  = $values['ra'];
      $readCouples($obj, $row, $date, $ra1);
   }
 
}
 
 
 
function eventName($delta) {
   if ($delta < 0.5) {
      return 'conj';
   }
   else
   if (($delta > 5) && ($delta < 6)) {
      return 'opp';
   }
   else {
      return 'false';
   }
}
 
?>
Vu que tu ne m'as pas répondu quelle était la version du PHP visée, j'ai fait une ébauche pour la version 5.3+
J'ai utilisé le passage par référence des tableaux parce que vu leur taille, le passage par copie allait prendre un certain temps.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 09h56   #29
Membre à l'essai
 
Christophe Bresso
Bricoleur
Inscription : septembre 2011
Messages : 32
Détails du profil
Informations personnelles :
Nom : Christophe Bresso

Informations professionnelles :
Activité : Bricoleur

Informations forums :
Inscription : septembre 2011
Messages : 32
Points : 20
Points : 20
Citation:
Envoyé par vorace Voir le message
ce qui nous donne :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
foreach($data as $cle0 => $valeur0){
	foreach($data as $cle1 => $valeur1){
		$i = 0;//evenement 'conj'
		$j = 0;//evenement 'opp'
		//...
		if($cle0 != $cle1){
 
		}
	}
}
Génial, je commence à y voir un peu plus clair.
Le problème avec cette double boucle foreach, c'est qu'elle va détecter deux fois le même événement. Par exemple :
Code :
1
2
$evenement['conj'][$x]=['objet1'=>'obj1','objet2'=>'obj3','date_debut'=>2555963,'date_fin'=>255964]
$evenement['conj'][$y]=['objet1'=>'obj3','objet2'=>'obj1','date_debut'=>2555963,'date_fin'=>255964]
Et la deuxième chose que je me demande c'est s'il n'est pas possible de remplacer tous les 'if' par un switch(true), parce que il y a quand même environ 5000 lignes dans chaque tableau qui sont au nombre de 10 et qu'il y a une dizaine d'événements à détecter. Je vais creuser dans ce sens.
En tout cas merci à vous deux pour ce débroussaillage.
CBresso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 10h35   #30
Membre à l'essai
 
Christophe Bresso
Bricoleur
Inscription : septembre 2011
Messages : 32
Détails du profil
Informations personnelles :
Nom : Christophe Bresso

Informations professionnelles :
Activité : Bricoleur

Informations forums :
Inscription : septembre 2011
Messages : 32
Points : 20
Points : 20
Waouh, impréssionnant
Si je comprend bien :
Citation:
Envoyé par rawsrc Voir le message
Code :
1
2
3
4
5
...
foreach($objects as $key => $obj) {
   $couples[$obj] = array_slice($objects, $key + 1);
}
...
$key+1 évite que des objets soient associés deux fois vu qu'un événement est commutatif ($couples['ob1]['ob2']==$couples['ob2']['ob1'])
CBresso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 11h07   #31
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 554
Points : 2 554
Envoyer un message via Skype™ à rawsrc
Citation:
Envoyé par CBresso Voir le message
$key+1 évite que des objets soient associés deux fois vu qu'un événement est commutatif ($couples['ob1]['ob2']==$couples['ob2']['ob1'])
Oui, il est ensuite plus simple de connaitre à l'avance les couples possibles pour les parcourir au besoin que de les créer au fur et à mesure avec un système imbriqué ingérable. En gros tu prépares les itérations et tu divises pour mieux regner.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 11h33   #32
Membre à l'essai
 
Christophe Bresso
Bricoleur
Inscription : septembre 2011
Messages : 32
Détails du profil
Informations personnelles :
Nom : Christophe Bresso

Informations professionnelles :
Activité : Bricoleur

Informations forums :
Inscription : septembre 2011
Messages : 32
Points : 20
Points : 20
Bon maintenant que le problème est bien structuré et circonscrit, reste manageEvents() à écrire
Je pense qu'il faut passer $obj et $otherobject en paramètres.
Par contre, rien n'indique à manageEvents() si l'événement est en cours ou s'il débute et rien ne lui indiquera qu'il est fini
Mais si dans $events[] le dernier événement concernant $obj et $otherobject a une date_fin = $date-$stepDate alors l'événement continue, sinon il commence.
Mouais ça devrait fonctionner
CBresso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 13h12   #33
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 554
Points : 2 554
Envoyer un message via Skype™ à rawsrc
Citation:
Envoyé par CBresso Voir le message
Bon maintenant que le problème est bien structuré et circonscrit, reste manageEvents() à écrire
ça devrait pas être trop dur quand même.
La question qu'il faut se poser est : est-ce que deux évènements identiques peuvent être simultanés ? Si oui, j'admets que ça devrait être un plus coton à écrire par contre, si les évènements ne peuvent être que successifs, c'est du gâteau. Par successif, j'entends qu'un évènement ne peut démarrer qu'à condition que l'évènement identique précédent soit terminé.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 14h35   #34
Membre à l'essai
 
Christophe Bresso
Bricoleur
Inscription : septembre 2011
Messages : 32
Détails du profil
Informations personnelles :
Nom : Christophe Bresso

Informations professionnelles :
Activité : Bricoleur

Informations forums :
Inscription : septembre 2011
Messages : 32
Points : 20
Points : 20
Deux objets ne peuvent effectivement avoir qu'un événement en commun et pour deux objets, les différents événements ne peuvent qu'être successifs. Donc oui je suis d'accord avec toi ça ne devrait plus être trop dur et je te remercie de ton aide.
Je considère le problème résolu.
CBresso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 14h44   #35
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 554
Points : 2 554
Envoyer un message via Skype™ à rawsrc
Si tu veux un avis, postes ton code une fois finalisé.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2012, 11h25   #36
Membre à l'essai
 
Christophe Bresso
Bricoleur
Inscription : septembre 2011
Messages : 32
Détails du profil
Informations personnelles :
Nom : Christophe Bresso

Informations professionnelles :
Activité : Bricoleur

Informations forums :
Inscription : septembre 2011
Messages : 32
Points : 20
Points : 20
Par défaut Une petite correction

Bon, le temps que je comprenne les closures.
À la place de :
Code :
$readCouples = function($obj, $row, $date, $ra1) use (&$data, &$couples)
il faut rajouter
Code :
$readCouples = function($obj, $row, $date, $ra1) use (&$data, &$couples, &$manageEvents)
Sinon, il y a une fatal error.
CBresso est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h41.


 
 
 
 
Partenaires

Hébergement Web