aide à la construction d'une chaine de caractere

Eléphanteau du PHP | 12 Messages

23 juil. 2012, 20:23

Bonjour à tous,
bon j'ai un fichier texte, qui contient les données comme suit:

Code : Tout sélectionner

N=0,x=23928392,y=2091039,zone=1 N=0,x=59091212,y=6766566,zone=1 N=0,x=23928392,y=2091039,zone=1 N=1,x=45450909,y=6766566,zone=1 N=1,x=23928392,y=2091039,zone=1 N=1,x=45450909,y=6766566,zone=1 N=2,x=23928392,y=2091039,zone=2 N=2,x=23928192,y=6766566,zone=2 N=2,x=23928392,y=2091039,zone=2 N=3,x=23928392,y=2091039,zone=2 N=3,x=23928192,y=6766566,zone=2 N=3,x=23928392,y=2091039,zone=2
aprés que je crée les variable pour stocker ce contenu comme ça:

Code : Tout sélectionner

$lines = file('C:\file.txt', FILE_IGNORE_NEW_LINES); $data = array(); for($i = 0, $c = count($lines); $i < $c; $i++) { $line = explode(',', rtrim($lines[$i])); if(strlen(rtrim($lines[$i])) != 0) { $n = explode('=', $line[0]); $n = $n[1]; $data[$n][] = $lines[$i]; $x = explode('=', $line[1]); $x = $x[1]; $y = explode('=', $line[2]); $y = $y[1]; $z = explode('=', $line[3]); $z = $z[1]; echo 'N='.$n.',x='.$x.',y='.$y.',zone='.$z.'<br>'; }

le contenu s'affiche comme suit:

Code : Tout sélectionner

N=0,x=23928392,y=2091039,zone=1 N=0,x=59091212,y=6766566,zone=1 N=0,x=23928392,y=2091039,zone=1 N=1,x=45450909,y=6766566,zone=1 N=1,x=23928392,y=2091039,zone=1 N=1,x=45450909,y=6766566,zone=1 N=2,x=23928392,y=2091039,zone=2 N=2,x=23928192,y=6766566,zone=2 N=2,x=23928392,y=2091039,zone=2 N=3,x=23928392,y=2091039,zone=2 N=3,x=23928192,y=6766566,zone=2 N=3,x=23928392,y=2091039,zone=2
ok, maintenant je voudrais créer deux chaines(chaine1 pour zone1 et chaine2 pour zone2) qui ont la forme suivant:
((x y,x y,x y),(x y,x y)), bon pour mon cas:

Code : Tout sélectionner

chaine1=((23928392 2091039,59091212 6766566,23928392 2091039), // pour N=0 (45450909 6766566,23928392 2091039,45450909 6766566)) //pour N=1 chaine2=((23928392 2091039,23928192 6766566,23928392 2091039), // pour N=2 (23928392 2091039,23928192 6766566,23928392 2091039)) // pour N=3
chaine1 contient les lignes qui appartient au zone1.et pour chaque N représente un (x y,x y,x y.. )

ViPHP
xTG
ViPHP | 7331 Messages

23 juil. 2012, 20:57

Stockes tes valeurs dans un array en prenant la zone comme index. ;)
Après plus qu'à boucler sur cet array et construire tes chaînes.

Mammouth du PHP | 2278 Messages

24 juil. 2012, 09:34

D'abord quelques remarques, ensuite une idée
<?PHP
$fichier = file('fichier.txt', FILE_IGNORE_NEW_LINES);
$data = array();
$nb_lignes = count($fichier);
for($i = 0; $i < $nb_lignes; $i++)  // il est inutile de répéter l'appel  à count.
{
    $ligne = explode(',', rtrim($fichier [$i]));
	/* une fois qu'on a explosé une ligne qui pourrait être vide, on teste sa longueur pour savoir si on va traiter 
	le contenu du tableau résultant!!! Mais ce test de longueur n'est pas suffisant car la ligne
	N=1 est de longueur supérieure à 0 et est donc traitée en générant une erreur. De plus != 0 inclut les valeurs 
	négatives. Pour avoir un traitement correct il faut compter le nombre d'éléments du tableau résultant*/
	 //if(strlen(rtrim($fichier[$i])) != 0) 
	 if (count($ligne) == 4)
	 {
    	$n = explode('=', $ligne[0]);
    	$n = $n[1];
 
	    $data[$n][] = $fichier[$i];//on se demande à quoi sert ce tableau;
 
    	$x = explode('=', $ligne[1]);
    	$x = $x[1];
 
 
    	$y = explode('=', $ligne[2]);
    	$y = $y[1];
 
    	$z = explode('=', $ligne[3]);
    	$z = $z[1];
   
    	echo 'N='.$n.',x='.$x.',y='.$y.',zone='.$z.'<br>';
	}

}
//  proposition à développer
$valeurs_finales = array();
foreach ($fichier as $ligne) // le tableau étant dans un fichier, comme on doit le parcourir en entier dans l'ordre
{
	$elements = explode (",", $ligne);
	$zone_nouvelle = 0;
	$n_nouveau = 0;
	if (count($elements) == 4)
	{
		$zone_ancienne = $zone_nouvelle;
		$n_ancien = 0;
		$zone_nouvelle = $elements[3];
		$n_nouveau = $elements[0];
		/*zone_ancienne et zone_nouvelle permettent de savoir quand on change de zone. idem pour n_ancien et n_nouveau.
                 On peut se fichier au changement de valeur de N pour savoir comment affecter les valeurs*/ 
			print "$n_nouveau $zone_nouvelle <br>";
	}
}

?>
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 12 Messages

24 juil. 2012, 16:31

Bonjour , merci de vos réponses,
sarakawa, j'ai pas compris pourquoi tu as mis ce test et à quoi sert le nombre 4 :

Code : Tout sélectionner

if (count($ligne) == 4)
ajoute à votre connaissance que un groupe de 'N' peut avoir minium 3 lignes .
maintenant les chaines comment les faire contruire.

Mammouth du PHP | 2278 Messages

24 juil. 2012, 18:57

if (count($ligne) == 4) sert à vérifier que la ligne a bien quatre éléments, ni plus ni moins, ce qui risque d'avoir de l'intérêt pour extraire correctement les données.
au lieu d'un simple test de longueur de la chaine qui autorise des données incorrectes (cf commentaires).
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 12 Messages

24 juil. 2012, 20:12

d'accord merci bien , un bon test,
maintenant comment faire pour contruire les chaines de la façon suivant:

Code : Tout sélectionner

chaine1= ((23928392,2091039,59091212,6766566,23928392,2091039),(45450909,6766566,23928392,2091039,45450909,6766566))

Code : Tout sélectionner

chaine2 = ((23928392 2091039,59091212 6766566,23928392 2091039),(45450909 6766566,23928392 2091039,45450909 6766566))

Mammouth du PHP | 2278 Messages

24 juil. 2012, 21:47

Il faut exploiter les variables zone_ancienne et zone_nouvelle et numero_ancien et numero_nouveau
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD