[PHP]Faire une boucleuu

Faire une boucleuu [PHP] - PHP - Programmation

Marsh Posté le 04-01-2005 à 00:58:51    

Bonsoir,
 
je dois faire un script en php
pour calculer la taille quee va prendre un nom  
derrière un maillot de football :
 
 
j'ai un tableau excel avec les 25 caractères de l'alphabet et la taille k'il prendront
en fonction de la lettre précedente
 
la tableau se presente comme ca :
 

Code :
  1. a    b    c    d    e    f    g   h   i   j.... espace
  2. a      1    1    1    1    1    1    1   1   1   1....   1
  3. b      1    1    1    1    1    1    1   1   1   1....   1
  4. c      1    1    1    1    1    1    1   1   1   1....   1
  5. d      1    1    1    1    1    1    1   1   1   1....   1
  6. e      1    1    1    1    1    1    1   1   1   1....   1
  7. f      1    1    1    1    1    1    1   1   1   1....   1
  8. g      1    1    1    1    1    1    1   1   1   1....   1
  9. h      1    1    1    1    1    1    1   1   1   1....   1
  10. i      1    1    1    1    1    1    1   1   1   1....   1
  11. j      0.9  0.9  0.9  0.9  0.9  0.9  0.9 0.9 0.9 0.9.... 0.9
  12. .
  13. .
  14. .
  15. espace 0.4  0.4  0.4  0.4  0.4  0.4  0.4 0.4 0.4 0.4.... 0.4


 
 
si la personne s'apelle jaja ca fera 0.4 + 0.9 + 1 + 0.9 = 3.4
 
0.4(avant le j un espace)
+
0.9(avant le a un j)
+
1(avant le j un a)
+
0.9(avant le a un j)
 
donc pour l'instant cette chaine est dans une variable ,
j'utilise la fonction strlen pour compter le nombre de caractères et j'aimerais bien faire une boucle

Code :
  1. $nbchainer=strlen($chaineDecaractere)
  2. for($i=1;$i<$nbchainer;$i++)
  3. {
  4. echo $chaineDecaractere[$i];
  5. }


 
merci


Message édité par kiruah le 11-01-2005 à 14:48:56
Reply

Marsh Posté le 04-01-2005 à 00:58:51   

Reply

Marsh Posté le 04-01-2005 à 01:16:33    

Heuu... ben il faudrait déjà peut-être stocker l'équivalent de ton tableau Excel dans un tableau PHP, du style :
 

Code :
  1. $a_long = array();
  2. $a_long['a']['a'] = 1;
  3. $a_long['a']['b'] = 1;
  4. ...
  5. $a_long[' '][' '] = 0.4;


 
Ensuite une fonction de type :
 

Code :
  1. function longueur_nom($nom, $a_long) {
  2.    $long = $a_long[$nom[0]][' '];
  3.    $nb_car = strlen($nom);
  4.      
  5.    for ($i = 1; $i < $nb_car; $i++) {
  6.       $long += $a_long[$nom[$i]][$nom[i - 1]];
  7.    }
  8.    return $long;
  9. }


 
(aucune vérification d'erreur ici, ça suppose que tu sais ce que tu fais de la fonction [par ex., pas de chaîne vide ou comprenant des caractères non compris dans le tableau.])


Message édité par sielfried le 04-01-2005 à 01:18:21

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 04-01-2005 à 02:15:30    

Merci pour la réponse  :)  
 
une question pour le tableau n'y aurait t'il pas un moyen plus "efficace" pasque la j'en ai pour des lignes et des lignes.
 
avec cette ecriture on peux faire une sorte de tableau editable ki ressemblerai " a s'y méprendre" au fichier exel ?  
 
ou mettre ca en base de donné mais je suis pas très inspiré
j'ai fait 26 tables a,b,c,d,e,fg,.... avec 26 champs avec un enregistrement par chant ki est la longeur
 
le but de la demarche etant de pouvoir avoir visuellement l'equivalent du fichier excel pour changer les données aisément


Message édité par kiruah le 04-01-2005 à 02:21:53
Reply

Marsh Posté le 04-01-2005 à 08:55:57    

En fait vu comme ça les valeurs de ton tableau ne dépendent que de la lettre précédente et jamais de la lettre "courante". En gros une ligne contient partout la même valeur.
 
Si c'est le cas alors ton tableau peut être réduit à une seule dimension.
 
Dans tous les cas, pour optimiser la création de ce genre de tableaux, tu peux te faire une fonction qui remplie des parties entières de celui-ci en utilisant les valeurs ASCII des caractères (qui te permettent de faire des boucles). Pour ça tu as chr() et ord() qui devraient t'être utiles.


Message édité par sielfried le 04-01-2005 à 08:56:36

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 10-01-2005 à 18:45:11    

j'ai essayé de mettre le tableau dans le fichier php mais ayant besoin de pouvoir le modifier a partir d'une interface administrateur le mieux serait de mettre ce tableau ->

Code :
  1. a    b    c    d    e    f    g   h   i   j.... espace
  2. a      1    1    1    1    1    1    1   1   1   1....   1
  3. b      1    1    1    1    1    1    1   1   1   1....   1
  4. c      1    1    1    1    1    1    1   1   1   1....   1
  5. d      1    1    1    1    1    1    1   1   1   1....   1 
  6. e      1    1    1    1    1    1    1   1   1   1....   1
  7. f      1    1    1    1    1    1    1   1   1   1....   1
  8. g      1    1    1    1    1    1    1   1   1   1....   1
  9. h      1    1    1    1    1    1    1   1   1   1....   1
  10. i      1    1    1    1    1    1    1   1   1   1....   1
  11. j      0.9  0.9  0.9  0.9  0.9  0.9  0.9 0.9 0.9 0.9.... 0.9


 
dans une base de donnée mais je c pas trop comment faire sachant que j'ai besoin du tableau a deux dimensions, j'ai fait une table par lettre mais je trouve pas ca super optimisé ....


Message édité par kiruah le 11-01-2005 à 14:48:16
Reply

Marsh Posté le 10-01-2005 à 20:37:26    

Hmm... ben ça fait effectivement un sacré joli nombre d'infos à stocker. Ce que tu peux aussi faire c'est stocker ça à l'intérieur d'un fichier. Il faudrait bien sûr sérialiser le tableau (voir www.php.net/serialise).
 
Ca peut aussi se faire en bdd mais une table avec un seul champ pas atomique, bof. [:figti]


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 11-01-2005 à 14:51:56    

je vien de créer la base ci dessous  

Code :
  1. CREATE TABLE `caractere` (
  2.   `id` int(3) NOT NULL auto_increment,
  3.   `AVANT` char(1) NOT NULL default '',
  4.   `A` char(3) NOT NULL default '',
  5.   `B` char(3) NOT NULL default '',
  6.   `C` char(3) NOT NULL default '',
  7.   `D` char(3) NOT NULL default '',
  8.   `E` char(3) NOT NULL default '',
  9.   `F` char(3) NOT NULL default '',
  10.   `G` char(3) NOT NULL default '',
  11.   `H` char(3) NOT NULL default '',
  12.   `I` char(3) NOT NULL default '',
  13.   `J` char(3) NOT NULL default '',
  14.   `K` char(3) NOT NULL default '',
  15.   `L` char(3) NOT NULL default '',
  16.   `M` char(3) NOT NULL default '',
  17.   `N` char(3) NOT NULL default '',
  18.   `O` char(3) NOT NULL default '',
  19.   `P` char(3) NOT NULL default '',
  20.   `Q` char(3) NOT NULL default '',
  21.   `R` char(3) NOT NULL default '',
  22.   `S` char(3) NOT NULL default '',
  23.   `T` char(3) NOT NULL default '',
  24.   `U` char(3) NOT NULL default '',
  25.   `V` char(3) NOT NULL default '',
  26.   `W` char(3) NOT NULL default '',
  27.   `X` char(3) NOT NULL default '',
  28.   `Y` char(3) NOT NULL default '',
  29.   `Z` char(3) NOT NULL default '',
  30.   `1` char(3) NOT NULL default '',
  31.   `2` char(3) NOT NULL default '',
  32.   `3` char(3) NOT NULL default '',
  33.   `4` char(3) NOT NULL default '',
  34.   `5` char(3) NOT NULL default '',
  35.   `6` char(3) NOT NULL default '',
  36.   `7` char(3) NOT NULL default '',
  37.   `8` char(3) NOT NULL default '',
  38.   `9` char(3) NOT NULL default '',
  39.   `0` char(3) NOT NULL default '',
  40.   `@` char(3) NOT NULL default '',
  41.   `ESPACE` char(3) NOT NULL default '',
  42.   PRIMARY KEY  (`id`)
  43. ) TYPE=MyISAM AUTO_INCREMENT=39 ;

 
 
Il y a autant d'enregistrement que de champs et un champs ressemble a ca
 

Code :
  1. INSERT INTO `caractere` VALUES (1, 'A', '2', '2', '1,6', '2', '1,6', '1,6', '2', '2', '0,4', '1,4', '1,6', '1,6', '2', '1,6', '2', '2', '2', '2', '2', '2', '2', '2', '3,6', '1,8', '1,8', '1,6', '1,2', '1,6', '1,6', '1,8', '1,6', '1,8', '1,6', '1,8', '1,8', '2', '3,6', '1,6');

 
 
 
Le but est d'apliquer une taille a chaque lettre d'une chaine, j'ai deja fait la fonction en "dur" sans base de donnée :  
 
 

Code :
  1. $a_long = array();
  2.    $a_long['A'][' '] = 1;
  3.    $a_long['A']['A'] = 1;
  4.    $a_long['A']['B'] = 2;
  5.    function longueur_nom($nom, $a_long)
  6.    {
  7.       //Définition de la variable $long  
  8.       $long = $a_long[$nom[0]][' '];
  9.       //Calcul du nombre total de caractère de $nom grace a la fonction strlen  
  10.       $nb_car = strlen($nom);
  11.       //Boucle resortant la valeur des lettres en les aditionnant       
  12.       for ($i = 1; $i < $nb_car; $i++)
  13.       {
  14.         $long += $a_long[$nom[$i]][$nom[$i - 1]];
  15.       }
  16.       //la fonction longueur_nom ressort la variable $long  
  17.       return $long;
  18.    }


 
le but etant d'apliquer a chaque lettre la taille en fonction de la lettre précédente

Reply

Marsh Posté le 13-01-2005 à 15:51:14    

Code :
  1. <?php
  2. require_once('../../Connections/modif.php');
  3. mysql_select_db($database_modif, $modif);
  4. $nom="AVDEFRGGD" ;
  5. $nb_car = strlen($nom);
  6. for ($i = 1; $i < $nb_car; $i++)
  7.    {
  8.   
  9.     $sql = "SELECT $nom[$i] FROM caractere WHERE lettre_Precedente = ".$nom[$i-1]."<br>";
  10.     $lettre = mysql_query($sql, $modif) or die(mysql_error());
  11.     $row_lettre = mysql_fetch_assoc($lettre);
  12.     echo $sql;
  13.     echo $row_lettre[$nom[$i]];
  14.    }
  15. ?>


 
voila ce que j'ai fait mais ca ne marche pas peut on mettre une connection dans une boucle ?
 
l'erreur est incomprensible  
 

Code :
  1. Erreur de syntaxe près de '' à la ligne 1


Message édité par kiruah le 13-01-2005 à 15:53:56
Reply

Marsh Posté le 13-01-2005 à 15:53:08    

WHERE lettre_Precedente = ".$nom[$i-1]."<br>"; [:wam]

Reply

Marsh Posté le 13-01-2005 à 15:56:37    

chacal_one333 a écrit :

WHERE lettre_Precedente = ".$nom[$i-1]."<br>"; [:wam]


oula oui hihi, j'avai testé de faire un echo sur $sql et j'ai oublié de réenlever le <br> ^^

Reply

Marsh Posté le 13-01-2005 à 15:56:37   

Reply

Marsh Posté le 13-01-2005 à 15:58:11    

dans la close du where il te faut mettre des simples quotes autour de ta variable, c'est la syntaxe SQL qui l'impose...
Et par contre, <br> dans ta requete, je suis sceptique...
 
 
essaie la condition:

Code :
  1. "WHERE lettre_Precedente = '".$nom[$i-1]."'"


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 13-01-2005 à 15:58:22    

et ton $nom[$i] je doute qu'il passe
 
 
 

$sql = "SELECT ".$nom[$i]." FROM caractere WHERE lettre_Precedente = '".$nom[$i-1]."'";


 
[:grilled]


Message édité par Profil supprimé le 13-01-2005 à 15:58:47
Reply

Marsh Posté le 13-01-2005 à 16:03:26    

chacal_one333 a écrit :

et ton $nom[$i] je doute qu'il passe
 
 
 

$sql = "SELECT ".$nom[$i]." FROM caractere WHERE lettre_Precedente = '".$nom[$i-1]."'";


 
[:grilled]


a oui ben justement avec ou sans ca marche que je mette le ".$nom[$i]." ou que je le laisse dans la chaine de caractère ca passe  

Reply

Marsh Posté le 13-01-2005 à 16:11:05    

kiruah a écrit :

a oui ben justement avec ou sans ca marche que je mette le ".$nom[$i]." ou que je le laisse dans la chaine de caractère ca passe


 
c'est pas le fait qu'il soit dans la chaine ou pas qui nous inquiété, la chaine principale étant en double quote, PHP remplacera la variable par sa valeur, par contre il faut normalement des simples quotes en plus pour que SQL accepte la requete...


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 13-01-2005 à 17:56:53    


et j'aimerais initialiser ma variable $nom[$i-1] car j'ai une erreur quand elle corespond a 0-1

Code :
  1. Notice: Uninitialized string offset: -1 in e:\program files\easyphp1-7\www\excel\final\calcul2.php on line 25


donc je donne une valeur :

Code :
  1. $nom[-1]="ESP";


ESP etant le champs espace dans ma base de donnée et il me retourne cette erreur

Code :
  1. Warning: Illegal string offset: -1 in e:\program files\easyphp1-7\www\excel\final\calcul2.php on line 19


Message édité par kiruah le 13-01-2005 à 18:43:54
Reply

Marsh Posté le 13-01-2005 à 21:23:39    

je crois pas que t'es le droit d'utiliser un index négatif pour chosiir une lettre d'un mot... la lettre de rend -1 n'existe pas dans $nom...
 
rajoute un if avant ton $sql=...etc...
if i-1>0 tu prend ta requete, else tu fait un where lettre_precedente='ESP'


Message édité par Xav_ le 13-01-2005 à 21:24:07

---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 14-01-2005 à 11:46:52    

Xav_ a écrit :

je crois pas que t'es le droit d'utiliser un index négatif pour chosiir une lettre d'un mot... la lettre de rend -1 n'existe pas dans $nom...
 
rajoute un if avant ton $sql=...etc...
if i-1>0 tu prend ta requete, else tu fait un where lettre_precedente='ESP'


 
Ca marche :D
 
 
Maintenant le problème c'est quand je saisie un espace j'ai mis une condition :

Code :
  1. if ($nom[$i]=" " )
  2.   {
  3.    $nom[$i]="ESP";
  4.   }


 
mais ca ne marche pas la programme arrète sa boucle


Message édité par kiruah le 14-01-2005 à 11:48:27
Reply

Marsh Posté le 14-01-2005 à 12:03:41    

normal, tjs le meme pb...
je crois que tu n'a pas bien compris ce que tu es en train de faire:
1/ $nom est une variable contenant un mot
2/ en programmation un mot est vu comme un tableau (à une ligne) de lettre
3/ donc $nom[0] est la 1ère lettre d'un mot (la lettre de rang -1 n'existe pas] --> pb d'avant
4/ "ESP" ça fait 3 lettres, que tu essai de mettre dans une seul en faisant $nom[$i]="ESP" --> nouveau pb
 
donc il ne faut pas que tu joue sur $i ou $nom, c'est ton mot de départ, il faut jouer une fois de plus sur le "where"
 

Code :
  1. if (($i-1<0) || ($nom[$i]==" " ))
  2. {
  3.   $sql = "SELECT $nom[$i] FROM caractere WHERE lettre_Precedente = 'ESP'"     
  4. }
  5. else
  6. {
  7.   $sql = "SELECT $nom[$i] FROM caractere WHERE lettre_Precedente = ".$nom[$i-1];     
  8. }


là ça doit pouvoir le faire ;)
 
EDIT: corrigé la boulette du "=" en "==" ;)


Message édité par Xav_ le 14-01-2005 à 17:35:54

---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 14-01-2005 à 16:43:35    

Code :
  1. <?php
  2. require_once('include/config.php');
  3. $nom = "aeiofdfdsfdu y";
  4. echo $nom."<br>";
  5. mysql_select_db($database_modif, $modif);
  6. $nb_car = strlen($nom);
  7. for ($i = 1; $i < $nb_car; $i++)
  8.    {
  9.   $z=$nom[$i-1];
  10.   if ($nom[$i]=" " )
  11.   {
  12.     $sql = "SELECT 'ESP' FROM caractere WHERE lettre_Precedente = '$z'";     
  13.   }
  14.   else
  15.   {
  16.     $sql = "SELECT `$nom[$i]` FROM caractere WHERE lettre_Precedente = '$z'";     
  17.   }
  18.   echo $sql."<br>";
  19.    }
  20. ?>


ca deconne en resultat j'ai  
 

Code :
  1. aeiofdfdsfdu y
  2. SELECT 'ESP' FROM caractere WHERE lettre_Precedente = 'a'
  3. SELECT 'ESP' FROM caractere WHERE lettre_Precedente = ' '
  4. SELECT 'ESP' FROM caractere WHERE lettre_Precedente = ' '
  5. SELECT 'ESP' FROM caractere WHERE lettre_Precedente = ' '
  6. SELECT 'ESP' FROM caractere WHERE lettre_Precedente = ' '
  7. SELECT 'ESP' FROM caractere WHERE lettre_Precedente = ' '
  8. SELECT 'ESP' FROM caractere WHERE lettre_Precedente = ' '
  9. SELECT 'ESP' FROM caractere WHERE lettre_Precedente = ' '
  10. SELECT 'ESP' FROM caractere WHERE lettre_Precedente = ' '
  11. SELECT 'ESP' FROM caractere WHERE lettre_Precedente = ' '
  12. SELECT 'ESP' FROM caractere WHERE lettre_Precedente = ' '
  13. SELECT 'ESP' FROM caractere WHERE lettre_Precedente = ' '
  14. SELECT 'ESP' FROM caractere WHERE lettre_Precedente = ' '


 
je comprend pas pouquoi la condition ne marche pas


Message édité par kiruah le 14-01-2005 à 16:45:08
Reply

Marsh Posté le 14-01-2005 à 17:34:04    

Citation :

je comprend pas pouquoi la condition ne marche pas


paske je suis un boulet et que tu as recopié ma connerie !!!
une condition n'est pas une affectation:
if ($nom[$i]==" " ) ...etc...
 
avec un seul "=" tu test pas si c'est un espace --> tu le remplace par un espace !!!
 
EDIT: par contre l'affichage de ta requete qui te montre que chaque lettre à été remplacée par un espace, ça mettait sur la voie ;)


Message édité par Xav_ le 14-01-2005 à 17:37:58

---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 14-01-2005 à 17:48:31    

[citation=953253,0,20][nom]Xav_ a écrit[/nom]
paske je suis un boulet [citation]
 
et moi un gros gros boullletttt [:buvons]
 
une condition n'est pas une affectation
une condition n'est pas une affectation
une condition n'est pas une affectation
une condition n'est pas une affectation
une condition n'est pas une affectation
une condition n'est pas une affectation
une condition n'est pas une affectation
...  
 
je le copieré 100 fois ^^
 
merci en tout cas  :bounce:  
 

Reply

Marsh Posté le 16-01-2005 à 16:46:05    

Code :
  1. <?php
  2. $nom="AVDERGGD   1D";
  3. $nb_car = strlen($nom);
  4. for ($i = 1; $i < $nb_car; $i++)
  5.    {
  6.   $z=$nom[$i-1];
  7.   if ($nom[$i]==" " )
  8.   {
  9.      $sql = "SELECT 'ESP' FROM caractere WHERE lettre_Precedente = '$z'";
  10.          
  11.   }
  12.   elseif($z==" " )
  13.   {
  14.      $sql = "SELECT `$nom[$i]` FROM caractere WHERE lettre_Precedente = 'ESP'";   
  15.   }
  16.   elseif($nom[$i]==" " && $z==" " )
  17.   {
  18.      $sql = "SELECT `ESP` FROM caractere WHERE lettre_Precedente = 'ESP'";   
  19.   }
  20.   else
  21.   {
  22.      $sql = "SELECT `$nom[$i]` FROM caractere WHERE lettre_Precedente = '$z'"; 
  23.   }
  24.   $chiffre = mysql_query($sql, $modif) or die(mysql_error());
  25.   $row_chiffre = mysql_fetch_assoc($chiffre);
  26.   $totalRows_chiffre = mysql_num_rows($chiffre);
  27.   echo $sql."<br>";
  28.     
  29.    }
  30. ?>


Résultat

Code :
  1. SELECT `V` FROM caractere WHERE lettre_Precedente = 'A'
  2. SELECT `D` FROM caractere WHERE lettre_Precedente = 'V'
  3. SELECT `E` FROM caractere WHERE lettre_Precedente = 'D'
  4. SELECT `R` FROM caractere WHERE lettre_Precedente = 'E'
  5. SELECT `G` FROM caractere WHERE lettre_Precedente = 'R'
  6. SELECT `G` FROM caractere WHERE lettre_Precedente = 'G'
  7. SELECT `D` FROM caractere WHERE lettre_Precedente = 'G'
  8. SELECT 'ESP' FROM caractere WHERE lettre_Precedente = 'D'
  9. SELECT 'ESP' FROM caractere WHERE lettre_Precedente = ' '
  10. SELECT 'ESP' FROM caractere WHERE lettre_Precedente = ' '
  11. SELECT `1` FROM caractere WHERE lettre_Precedente = 'ESP'
  12. SELECT `D` FROM caractere WHERE lettre_Precedente = '1'

comment se fait t'il k'il reste des ' ' ma condition etait de remplacer tout les ' ' par des 'ESP' :'(


Message édité par kiruah le 16-01-2005 à 16:47:33
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed