[Php] Construction de tableaux

Résolu/Fermé
Xandler Messages postés 38 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 10 mai 2007 - 26 avril 2007 à 13:51
 Utilisateur anonyme - 27 avril 2007 à 17:06
Bonjour à tous, voilà mon soucis :
Je souhaite récupérer dans mon tableau $tab les variables $var et leur valeurs correspondent $val !
Voici mon bout de code :

try {

$retourR=$connexion->read();
echo "Résultat de la requete : $retourR";
$res=$retourR;
$array_res=explode("\n",$res);
$i = 0;
$tab=array();
while ($i<count($array_res)) {
if (strncmp($array_res[$i],"$",1)==0 || strncmp($array_res[$i],"[",1)==0) {
if (strncmp($array_res[$i],"$",1)==0) //compare deux chaines de caractères sur une longueur de 1.
{
$var = substr( $array_res[$i] , 1 , strlen($array_res[$i]));
$i++;
}
if (strncmp($array_res[$i],"[",1)==0)
{
$val = substr( $array_res[$i] , 3 , strlen($array_res[$i]));
$i++;
}
echo "valeur de ".$var." = ".$val;
//tableau du découpage des résultats
}
else
$i++;
}

Le problème, c'est que je ne vois pas comment faire correspondre une variable avec plusieurs valeurs ! bref, je galère !
Avez vous une suggestion à me proposer svp ?
Merci d'avance
A voir également:

3 réponses

Bonjour,

Peux-tu nous donner un exemple du contenu de $retourR.

merci,

MedELID
0
Xandler Messages postés 38 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 10 mai 2007
26 avril 2007 à 14:37
Bien sûr, en fait $retour constitue un fichier genre .txt qui est la sortie buffer d'une fonction écrite sous le langage R.
En voici un exemple :
------------------
$statistiqueShapiro
[1] 0.571231 0.6485

$alpha
[1] 0.05

$conclusion
[1] "Le graphique représente donc le nuage de points correspondant aux valeurs observées associé à la droite caractéristique de la loi normale. On pourra conclure que si le nuage semble suivre la droite, alors l'échantillon suivra une loi normale ! Aussi, le test de Shapiro-Wilk permet de comparer les valeurs observées à la loi normale. Cette valeur indique que plus celle-ci est proche de 1 alors plus la distribution sera normale. Ainsi, si cette valeur de test est supérieure au seuil alpha, on suivra alors une loi normale !"

$verdict
[1] "On en déduit que l'on suit donc bien une loi normale"
---------------------

En fait je voudrais réunir les valeurs $val=0.571231 et $val=0.6485 dans la variable $var=statistiqueShapiro. Et tout ça dans un tableau !
Est ce possible ? Merci
0
Utilisateur anonyme
26 avril 2007 à 15:03
Donc voici ce que je te propose
<?php

//Un exemple
$res=    "\$statistiqueShapiro\n" .
    "[1] 0.571231 0.6485 \n" .
    "\n".
    "\$alpha\n" .
    "[1] 0.05";

$array_res=explode("\n",$res); 

//print_r($array_res);
$tab=array(); 

for($i=0;$i<count($array_res);$i++) { 
    if (strncmp($array_res[$i],"$",1)==0 ){
        $nomVar = substr( $array_res[$i] , 1 , strlen($array_res[$i])); 
        $tab[$nomVar]=array(); 
    }elseif (strncmp($array_res[$i],"[",1)==0) { 
        $val = substr( $array_res[$i] , 3 , strlen($array_res[$i])); 
        //Attention aux chaines de car. "ma chaine" il peuvent contenir des espaces
        $tab[$nomVar]=explode(" ",trim($val));         
    } 
} 

echo '<pre>';
print_r($tab);
echo '</pre>';
?>
0
Xandler Messages postés 38 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 10 mai 2007 > Utilisateur anonyme
26 avril 2007 à 15:17
Je te remercie, ça marche bien mais comme tu l'avais prévu, la fonction 'trim' prend aussi en compte les espaces de ma chaîne de caractère alors qu'elle se présente comme une seule réponse à la variable correspondante !
Tu crois qu'il y a un moyen d'y remédier ?
Encore merci
0
Utilisateur anonyme
26 avril 2007 à 15:50
Pour info trim supprime juste les espaces qui se trouvent au début et à la fin d'une chaîne.

Voici une autre solution qui prend en compte les chaîines :

<?php

//Un exemple
$res=	"\$statistiqueShapiro\n" .
		"[1] 0.571231 0.6485 \n" .
		"\n".
		"\$alpha\n" .
		"[1] 0.05\n" .
		"\$conclusion\n" .
		"[1] \"Le graphique représente donc le nuage de points correspondant aux valeurs observées associé à la droite caractéristique de la loi normale. On pourra conclure que si le nuage semble suivre la droite, alors l'échantillon suivra une loi normale ! Aussi, le test de Shapiro-Wilk permet de comparer les valeurs observées à la loi normale. Cette valeur indique que plus celle-ci est proche de 1 alors plus la distribution sera normale. Ainsi, si cette valeur de test est supérieure au seuil alpha, on suivra alors une loi normale !\"\n" .
		"\n" .
		"\$verdict \n" .
		"[1] \"On en déduit que l'on suit donc bien une loi normale\"";

$array_res=explode("\n",$res); 

//print_r($array_res);
$tab=array(); 

for($i=0;$i<count($array_res);$i++) { 
	if (strncmp($array_res[$i],"$",1)==0 ){
		$nomVar = trim(substr( $array_res[$i] , 1 , strlen($array_res[$i]))); 
		$tab[$nomVar]=array(); 
	}elseif (strncmp($array_res[$i],"[",1)==0) { 
		$val = trim(substr( $array_res[$i] , 3 , strlen($array_res[$i]))); 
		//Attention aux chaines de car. "ma chaine" il peuvent contenir des espaces
		if(ereg('^".*"$',$val)) // c'est une chaine (attention une seule) ca ne prend pas en compte "Ma chaine1"  "Ma chaine2"
			$tab[$nomVar][]=trim($val);
		else
			$tab[$nomVar]=explode(" ",trim($val));
	} 
} 

echo '<pre>';
print_r($tab);
echo '</pre>';
?>
0
Xandler Messages postés 38 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 10 mai 2007
26 avril 2007 à 16:06
C parfait je te remercie !
Par contre je n'ai pas compris à quoi servait le [] du $tab[$nomVar][] dans le if du ereg !!
Peux tu m'éclairer une dernière fois ?
Merci pour tout !
0
Utilisateur anonyme > Xandler Messages postés 38 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 10 mai 2007
26 avril 2007 à 16:18
Parceque dans le traitement, on a supposé que tous les éléments de $tab sont aussi des tableaux '$tab[$nomVar]=array(); ', ceci dit :
$tab[$nomVar][]=trim($val);
va inserer trim($val) dans le tableau (multidimensionnel) $tab[$nomVar] à la derniere positions +1.

Cela peut t'être très utilles après, dans ton traitement.
0
Xandler Messages postés 38 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 10 mai 2007 > Utilisateur anonyme
26 avril 2007 à 16:21
Ok je vois !
En tout cas, merci beaucoup tu m'as été d'un grand secours !
Passe une bonne journée !
0
Xandler Messages postés 38 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 10 mai 2007 > Utilisateur anonyme
26 avril 2007 à 16:37
Juste une dernière chose avant que tu me laisse tomber pour de bon ;)
(Je profite que tu sois là)
la sortie buffer de R avec plusieurs valeurs donne :
----------------------------------
$statistiqueShapiro
[1] 1.4834945 -0.2917662 -1.2723906 -0.3298322 -1.9793199 0.5722631
[7] 2.1656412 0.1625851 0.8576816 -0.3166099

$alpha
[1] 0.05

$conclusion
[1] "Le graphique représente donc le nuage de points correspondant aux valeurs observées associé à la droite caractéristique de la loi normale. On pourra conclure que si le nuage semble suivre la droite, alors l'échantillon suivra une loi normale ! Aussi, le test de Shapiro-Wilk permet de comparer les valeurs observées à la loi normale. Cette valeur indique que plus celle-ci est proche de 1 alors plus la distribution sera normale. Ainsi, si cette valeur de test est supérieure au seuil alpha, on suivra alors une loi normale !"

$verdict
[1] "On en déduit que l'on suit donc bien une loi normale"
---------------------------------------

Des crochets se mettent en début de chaque ligne concernant le statistiqueShapiro, et je ne pense pas que l'expression régulière utilisée règle le problème !
Vu que je ne suis pas franchement doué pour ces expressions, pense tu pouvoir m'aider ( the last one c juré ! )
A moins que j'essaie de travailler juste entre les $ ??
Re-Re-MERCI !
0
Utilisateur anonyme > Xandler Messages postés 38 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 10 mai 2007
27 avril 2007 à 01:49
Non l'expression régulière n'a rien à voir avec ce problème,

en fait le problème venait de la ligne $tab[$nomVar]=explode(" ",trim($val));

Quand cette ligne et appelé une deuxième fois avec la même valeur de $nomVar, dans ton cas statistiqueShapiro, les premières valeurs sont écrasées.

Bon voici une solution,

je reste à ta disposition si tu as d'autres remarques :

<?php

//Un exemple
$res= "\$statistiqueShapiro\n" .
  "[1] 0.571231 0.6485 \n" .
  "[7] 2.1656412 0.1625851 0.8576816 -0.3166099 \n" .
  "\n".
  "\$alpha\n" .
  "[1] 0.05\n" .
  "\$conclusion\n" .
  "[1] \"Le graphique représente donc le nuage de points correspondant aux valeurs observées associé à la droite caractéristique de la loi normale. On pourra conclure que si le nuage semble suivre la droite, alors l'échantillon suivra une loi normale ! Aussi, le test de Shapiro-Wilk permet de comparer les valeurs observées à la loi normale. Cette valeur indique que plus celle-ci est proche de 1 alors plus la distribution sera normale. Ainsi, si cette valeur de test est supérieure au seuil alpha, on suivra alors une loi normale !\"\n" .
  "\n" .
  "\$verdict \n" .
  "[1] \"On en déduit que l'on suit donc bien une loi normale\"";

$array_res=explode("\n",$res); 

//print_r($array_res);
$tab=array(); 

for($i=0;$i<count($array_res);$i++) { 
 if (strncmp($array_res[$i],"$",1)==0 ){
  $nomVar = trim(substr( $array_res[$i] , 1 , strlen($array_res[$i]))); 
  $tab[$nomVar]=array(); 
 }elseif (strncmp($array_res[$i],"[",1)==0) { 
  $val = trim(substr( $array_res[$i] , 3 , strlen($array_res[$i]))); 
  //Attention aux chaines de car. "ma chaine" il peuvent contenir des espaces
  if(ereg('^".*"$',$val)) // c'est une chaine (attention une seul) ca ne prend pas en compte "Ma chaine1"  "Ma chaine2"
   $tab[$nomVar][]=trim($val);
  else{
   $tabTemp=explode(" ",trim($val));
   foreach($tabTemp as $valT)
    $tab[$nomVar][]=$valT;
  }
 } 
} 

echo '<pre>';
print_r($tab);
echo '</pre>';
?>



Bonne nuit,

MedELID
0
Utilisateur anonyme
27 avril 2007 à 12:19
Non, ce n’est pas le résultat que j'obtiens :
Array
(
    [statistiqueShapiro] => Array
        (
            [0] => 0.571231
            [1] => 0.6485
            [2] => 2.1656412
            [3] => 0.1625851
            [4] => 0.8576816
            [5] => -0.3166099
            [6] => ]
            [7] => 2.16433739
            [8] => -0.73519664
            [9] => -0.31011329
        )

    [alpha] => Array
        (
            [0] => 0.05
        )

    [conclusion] => Array
        (
            [0] => "Le graphique ...ale !"
        )

    [verdict] => Array
        (
            [0] => "On en déduit ..normale"
        )

)


Comme tu peux le remarquer, il y a juste une petite erreur dans [6] => ]

Bon voici une autre solution :
<?php
//Un exemple
$res=	"\$statistiqueShapiro\n" .
		"[1] 0.571231 0.6485 \n" .
		"[7] 2.1656412 0.1625851 0.8576816 -0.3166099 \n" .
		"[13] 2.16433739 -0.73519664 -0.31011329\n" .
		"\n".
		"\$alpha\n" .
		"[1] 0.05\n" .
		"\$conclusion\n" .
		"[1] \"Le graphique repré...u seuil alpha, on suivra alors une loi normale !\"\n" .
		"\n" .
		"\$verdict \n" .
		"[1] \"On en déduit que l... bien une loi normale\"";

$array_res=explode("\n",$res); 

//print_r($array_res);
$tab=array(); 

for($i=0;$i<count($array_res);$i++) { 
	if (strncmp($array_res[$i],"$",1)==0 ){
		$nomVar = trim(substr( $array_res[$i] , 1 , strlen($array_res[$i]))); 
		$tab[$nomVar]=array(); 
	}elseif (strncmp($array_res[$i],"[",1)==0) { 
		$val = trim(substr( $array_res[$i] , strpos($array_res[$i],']')+1 , strlen($array_res[$i]))); 
		//Attention aux chaines de car. "ma chaine" il peuvent contenir des espaces
		if(ereg('^".*"$',$val)) // c'est une chaine (attention une seul) ca ne prend pas en compte "Ma chaine1"  "Ma chaine2"
			$tab[$nomVar][]=trim($val);
		else{
			$tabTemp=explode(" ",trim($val));
			foreach($tabTemp as $valT)
				$tab[$nomVar][]=$valT;
		}
	} 
} 

echo '<pre>';
print_r($tab);
echo '</pre>';
?>


______________________________________________
Le résultat est :
Array
(
    [statistiqueShapiro] => Array
        (
            [0] => 0.571231
            [1] => 0.6485
            [2] => 2.1656412
            [3] => 0.1625851
            [4] => 0.8576816
            [5] => -0.3166099
            [6] => 2.16433739
            [7] => -0.73519664
            [8] => -0.31011329
        )

    [alpha] => Array
        (
            [0] => 0.05
        )

    [conclusion] => Array
        (
            [0] => "Le graphique repré...u seuil alpha, on suivra alors une loi normale !"
        )

    [verdict] => Array
        (
            [0] => "On en déduit que l... bien une loi normale"
        )

)
0
Xandler Messages postés 38 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 10 mai 2007
27 avril 2007 à 12:51
Salut,
ça m'enerve je ne comprends pas : g le même code que toi et ça ne marche pas, il me renvoie seulement la dernière ligne !
Je pense que le problème est que, dans la véritable sortie de R, il n'y a pas de retour à la ligne après les deux premières lignes de résultats de statistiqueShapiro !
C'est possible ?
Y a t-il une solution ?
Je suis chiant, non ?
0
Utilisateur anonyme
27 avril 2007 à 15:27
Oui c'est possible, parce qu’un retour à la ligne est représenté par :
\n ou par \r\n (Forme générale sous Windows).

Donc je te conseille de lire ton fichier ligne par ligne (fget()) et de retourner directement un tableau.

Sinon il me faut ton fichier texte pour pouvoir te dire plus.

Dernière chose, est-ce que l'information entre [] n'est pas importante pour ton traitement par la suite ???.

MedELID
0
Xandler Messages postés 38 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 10 mai 2007 > Utilisateur anonyme
27 avril 2007 à 15:57
Je vais me renseigner sur fget() !
Sinon, t'inquiète la valeur de [] n'est pas importante !
Je te remercie pour tout !
Bonne continuation @+
0
Xandler Messages postés 38 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 10 mai 2007 > Xandler Messages postés 38 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 10 mai 2007
27 avril 2007 à 17:01
C résolu en fait c'était un soucis d'espaces juste avant les crochets !
Quand je comparais le premier caractère avec l'espace, il ignorait donc la ligne !!
Enfin, .............
0
Utilisateur anonyme > Xandler Messages postés 38 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 10 mai 2007
27 avril 2007 à 17:06
Youpiiiiii :D
0