Probleme boucle dans une boucle

Résolu/Fermé
Fuji60 Messages postés 23 Date d'inscription jeudi 9 août 2012 Statut Membre Dernière intervention 8 juin 2014 - Modifié par Fuji60 le 14/01/2013 à 13:13
Fuji60 Messages postés 23 Date d'inscription jeudi 9 août 2012 Statut Membre Dernière intervention 8 juin 2014 - 14 janv. 2013 à 17:21
Bonjour à tous,

voila, j'ai un gros problème avec mon code PHP. J'ai dans un fichier des valeurs que j'ai récupéré, et c'est l'amplitude de quelque chose en fonction du temps, donc elle varie. Si l'on avait une image, la courbe serait sinusoidale, donc il y a plusieurs pics d'amplitude. J'ai réussi à faire un code qui permet de trouver les intervalles ou il pourrait y avoir des pics d'amplitude, mais maintenant, je dois trouver ces pics d'amplitude en question mais je n'y parviens pas. Voici la partie de code la plus importante pour vous situer dans le contexte, c'est à partir du while que ca pose problème, car j'ai mis une boucle dans une boucle, mais je crois pas que ca soit la bonne solution, merci d'avance :

<?php
$temporaire = array (); 
$l = count($donnees); 

for($cle=0; $cle < $l ;$cle++) // On va extraire du tableau donnees toutes les valeurs surperieur a la borne inferieur 468 et on va le mettre dans le tableau temporaire. 
{ 
if($donnees[$cle]["amplitude"] > $borne_inf) 
{ 
$temporaire[]=array('temps'=> $donnees[$cle]['temps'],'amplitude'=> $donnees[$cle]["amplitude"] ) ; 
} 
} 


echo '<pre>'; 
print_r($temporaire); // On affiche les données contenu dans le tableau. 
echo '</pre>'; 



$l = count($temporaire); // Count va compter tous les elements du tableau temporaire, et on la met dans la variable $l. 
$debut_intervalle=0; // On définit la variable 
$fin_intervalle=0; // On définit la variable 
$i = 0; // On définit la variable 
$maxi = array(); // On créer le tableau maxi qui va contenir les maximum d'amplitude. 
$indice=0; // On definit les variables. 


while($i<$l-1) // Tant qu'on est pas passer par tous les elements du tableau temporaire... 
{ 
if(($temporaire[$i+1]['temps']-$temporaire[$i]['temps']>0.3) || $i==$l-2) // Si l'on change d'intervalle. 
{ 
$fin_intervalle=$i; 
echo "pic d'amplitude trouvé entre $debut_intervalle et $fin_intervalle <br>"; $debut_intervalle=$i+1; // On cherche les intervalles de clé. 
$maximum=$temporaire[$debut_intervalle]['amplitude']; // Début de la monté pour l'amplitude. 
echo "Au début de l'intervalle, le maximum vaut $maximum <br>" ; 
$temps_max=$temporaire[$debut_intervalle]['temps']; // Début de la monté pour le temps. 
echo "Au début de l'intervalle , le temps vaut $temps_max <br>" ; 
for($k=$debut_intervalle ;$k < $l-1; $k++) // Tant que l'on est pas passer par tous les elements du tableau 
{ 
if($temporaire[$k]['amplitude'] > $maximum AND $temporaire[$k]['temps'] > $temps_max) // Si l'amplitude est supérieur à la monté de l'amplitude. 
{ 
$maximum=$temporaire[$k]['amplitude']; // L'amplitude est égale au début de la monté. 
$temps_max=$temporaire[$k]['temps']; // Le temps est égale au temps du début de la monté. 
echo "$temps_max 
"; 
echo"$maximum 
"; 
} 
$maxi[$indice]['temps']=$temps_max; 
$maxi[$indice]['amplitude']=$maximum; 
} 
$indice++; 
} 

$i++; 
} 


?> 

6 réponses

Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
14 janv. 2013 à 13:32
pas forcement besoin des données, mais avec foreach c'est beaucoup plus simple, essayes comme ça:

<?php
$temporaire = array();

foreach($donnees as $cle=>$value){
	if($value["amplitude"] > $borne_inf)
	{
		$temporaire[]=array('temps'=> $value['temps'],'amplitude'=>$value["amplitude"] ) ;
	}

}
echo 'Donnees supérieurs au mini:<br /><pre>';
print_r($temporaire); // On affiche les données contenu dans le tableau.
echo '</pre>';

$memo_valeur=0;
$array_pics=array();
$c=0;
foreach($temporaire as $cle=>$s_array){
	
	if($cle>0){
		if($s_array['amplitude'] > $memo_valeur){
			//on est dans une partie montante
			//on memorise la valeur
			$memo_valeur=$s_array['amplitude'];
		}else{
			//on est dans une partie descendante
			//on memorise la valeur
			$memo_valeur=$s_array['amplitude'];
			//on memorise le pics  (clef précedente)
			$array_pics[$c]['temps']=$temporaire[$clef-1]['temps'];
			$array_pics[$c]['amplitude']=$temporaire[$clef-1]['amplitude'];
		}
	}
	$c++;
}

echo 'Array des pics<br /><pre>';
print_r($array_pics); // On affiche les données contenu dans le tableau.
echo '</pre>';


?>
1
Fuji60 Messages postés 23 Date d'inscription jeudi 9 août 2012 Statut Membre Dernière intervention 8 juin 2014 1
14 janv. 2013 à 15:15
Merci de votre réponse Alain.

En utilisant votre code, ca m'affiche 272 valeurs vides pour le tableau array_pics. Il devrait normalement y avoir 6 pics, comme il y a 6 intervalles. Ca me repete aussi Undefined variable: clef et Undefined variable: -1
1
seabust Messages postés 741 Date d'inscription lundi 10 mars 2008 Statut Membre Dernière intervention 30 juillet 2015 101
14 janv. 2013 à 12:40
Si tu pouvais nous donner ta source de données ça serait plus utile que ton code.
0
Fuji60 Messages postés 23 Date d'inscription jeudi 9 août 2012 Statut Membre Dernière intervention 8 juin 2014 1
14 janv. 2013 à 13:20
Oui biensur, je vous le met directement ici. Successivement, on a le temps, puis le tiret, et l'amplitude, et ainsi de suite.

15.01-466
15.02-474
15.03-468
15.04-478
15.05-469
15.06-480
15.07-474
15.08-485
15.09-484
15.1-493
15.11-485
15.12-497
15.13-489
15.14-496
15.15-494
15.16-497
15.17-501
15.18-503
15.19-505
15.2-507
15.21-506
15.22-500
15.23-508
15.24-500
15.25-510
15.26-502
15.27-508
15.28-503
15.29-512
15.3-501
15.31-515
15.32-509
15.33-516
15.34-510
15.35-516
15.36-508
15.37-518
15.38-516
15.39-520
15.4-510
15.41-514
15.42-507
15.43-514
15.44-505
15.45-500
15.46-491
15.47-479
15.48-463
15.49-454
15.5-437
15.51-67.54
15.52-431
15.53-424
15.54-413
15.55-415
15.56-408
15.57-409
15.58-401
15.59-407
15.6-404
15.61-411
15.62-402
15.63-416
15.64-408
15.65-422
15.66-419
15.67-425
15.68-431
15.69-436
15.7-438
15.71-448
15.72-443
15.73-453
15.74-447
15.75-451
15.76-446
15.77-450
15.78-451
15.79-448
15.8-455
15.81-451
15.82-456
15.83-458
15.84-463
15.85-460
15.86-471
15.87-468
15.88-476
15.89-468
15.9-483
15.91-477
15.92-489
15.93-483
15.94-488
15.95-481
15.96-488
15.97-483
15.98-495
15.99-490
16.0-491
16.01-492
16.02-489
16.03-492
16.04-493
16.05-491
16.06-497
16.07-497
16.08-495
16.09-491
16.1-495
16.11-501
16.12-495
16.13-501
16.14-498
16.15-501
16.16-497
16.17-507
16.18-503
16.19-510
16.2-501
16.21-511
16.22-501
16.23-509
16.24-500
16.25-507
16.26-500
16.27-505
16.28-491
16.29-486
16.3-467
16.31-463
16.32-446
16.33-71.71
16.34-434
16.35-419
16.36-411
16.37-405
16.38-395
16.39-392
16.4-393
16.41-393
16.42-387
16.43-390
16.44-389
16.45-400
16.46-397
16.47-401
16.48-400
16.49-404
16.5-408
16.51-415
16.52-421
16.53-430
16.54-431
16.55-433
16.56-433
16.57-444
16.58-436
16.59-443
16.6-442
16.61-445
16.62-441
16.63-441
16.64-439
16.65-445
16.66-451
16.67-448
16.68-454
16.69-450
16.7-453
16.71-457
16.72-467
16.73-466
16.74-474
16.75-470
16.76-478
16.77-474
16.78-477
16.79-481
16.8-489
16.81-483
16.82-489
16.83-483
16.84-494
16.85-488
16.86-495
16.87-487
16.88-492
16.89-489
16.9-500
16.91-490
16.92-499
16.93-494
16.94-496
16.95-495
16.96-499
16.97-498
16.98-500
16.99-501
17.0-501
17.01-503
17.02-500
17.03-505
17.04-497
17.05-503
17.06-502
17.07-510
17.08-503
17.09-513
17.1-499
17.11-506
17.12-504
17.13-508
17.14-501
17.15-501
17.16-485
17.17-475
17.18-459
17.19-444
17.2-67.54
17.21-422
17.22-418
17.23-402
17.24-398
17.25-388
17.26-381
17.27-375
17.28-371
17.29-373
17.3-369
17.31-369
17.32-370
17.33-376
17.34-373
17.35-372
17.36-373
17.37-382
17.38-383
17.39-394
17.4-396
17.41-402
17.42-407
17.43-416
17.44-416
17.45-425
17.46-421
17.47-427
17.48-419
17.49-429
17.5-429
17.51-431
17.52-428
17.53-435
17.54-434
17.55-440
17.56-445
17.57-448
17.58-450
17.59-455
17.6-458
17.61-461
17.62-464
17.63-462
17.64-474
17.65-468
17.66-479
17.67-471
17.68-483
17.69-477
17.7-482
17.71-483
17.72-489
17.73-480
17.74-493
17.75-480
17.76-492
17.77-483
17.78-491
17.79-493
17.8-495
17.81-488
17.82-495
17.83-492
17.84-495
17.85-502
17.86-499
17.87-499
17.88-502
17.89-497
17.9-498
17.91-503
17.92-503
17.93-509
17.94-506
17.95-510
17.96-501
17.97-505
17.98-498
17.99-505
18.0-500
18.01-508
18.02-505
18.03-509
18.04-499
18.05-506
18.06-502
18.07-503
18.08-495
18.09-491
18.1-472
18.11-454
18.12-443
18.13-63.14
18.14-423
18.15-411
18.16-407
18.17-393
18.18-389
18.19-383
18.2-373
18.21-371
18.22-372
18.23-371
18.24-367
18.25-374
18.26-370
18.27-376
18.28-366
18.29-376
18.3-371
18.31-382
18.32-382
18.33-399
18.34-401
18.35-413
18.36-413
18.37-420
18.38-412
18.39-418
18.4-417
18.41-424
18.42-426
18.43-435
18.44-431
18.45-438
18.46-439
18.47-437
18.48-445
18.49-443
18.5-452
18.51-448
18.52-460
18.53-452
18.54-460
18.55-458
18.56-467
18.57-464
18.58-472
18.59-470
18.6-481
18.61-477
18.62-484
18.63-481
18.64-491
18.65-483
18.66-494
18.67-489
18.68-495
18.69-489
18.7-494
18.71-494
18.72-492
18.73-493
18.74-499
18.75-492
18.76-500
18.77-497
18.78-495
18.79-499
18.8-502
18.81-502
18.82-496
18.83-499
18.84-502
18.85-508
18.86-504
18.87-506
18.88-500
18.89-508
18.9-502
18.91-509
18.92-511
18.93-516
18.94-509
18.95-518
18.96-512
18.97-512
18.98-515
18.99-515
19.0-513
19.01-516
19.02-504
19.03-496
19.04-490
19.05-479
19.06-464
19.07-450
19.08-436
19.09-61.15
19.1-423
19.11-412
19.12-407
19.13-402
19.14-396
19.15-396
19.16-396
19.17-401
19.18-390
19.19-395
19.2-389
19.21-406
19.22-399
19.23-412
19.24-413
19.25-418
19.26-414
19.27-425
19.28-421
19.29-435
19.3-436
19.31-443
19.32-443
19.33-446
19.34-444
19.35-446
19.36-446
19.37-443
19.38-444
19.39-448
19.4-446
19.41-447
19.42-448
19.43-449
19.44-461
19.45-456
19.46-464
19.47-459
19.48-465
19.49-457
19.5-471
19.51-470
19.52-478
19.53-474
19.54-480
19.55-475
19.56-475
19.57-473
19.58-483
19.59-483
19.6-482
19.61-479
19.62-484
19.63-485
19.64-489
19.65-485
19.66-486
19.67-490
19.68-486
19.69-493
19.7-489
19.71-490
19.72-492
19.73-497
19.74-491
19.75-495
19.76-495
19.77-496
19.78-490
19.79-501
19.8-496
19.81-502
19.82-493
19.83-497
19.84-493
19.85-498
19.86-495
19.87-501
19.88-494
19.89-498
19.9-495
19.91-504
19.92-496
19.93-505
19.94-499
19.95-505
19.96-497
19.97-486
19.98-473
19.99-458
20.0-450
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
14 janv. 2013 à 16:33
suite a test en réel avec tes données, voici rectifs de mes erreurs:

foreach($temporaire as $cle=>$s_array){
	
	if($cle>0){
		if($s_array['amplitude'] > $memo_valeur){
			//on est dans une partie montante
			//on memorise la valeur
			$memo_valeur=$s_array['amplitude'];
		}else{
			//on est dans une partie descendante
			//on memorise la valeur
			$memo_valeur=$s_array['amplitude'];
			//on memorise le pics  (cle précedente)
			$array_pics[$c]['temps']=$temporaire[$cle-1]['temps']; //erreur la clef au lieu de cle
			$array_pics[$c]['amplitude']=$temporaire[$cle-1]['amplitude']; //erreur la clef au lieu de cle
			$c++; //increment compteur ici
		}
	}
	
}
0
Fuji60 Messages postés 23 Date d'inscription jeudi 9 août 2012 Statut Membre Dernière intervention 8 juin 2014 1
14 janv. 2013 à 17:21
Ouaahou ! Merci Beaucoup Alain_42, ca fonctionne, merci encore pour le temps que vous m'avez accordé :D Je marque le sujet comme résolu !
0