while retour à la ligne dans un tableau

Eléphant du PHP | 116 Messages

01 avr. 2010, 20:26

Alors je coince ici.
Je comprend pas qu'est ce que ça signifie.
if ($cpt%$nbCols==($nbCols-1)) // on divise le nb d'élément par le nb de colonnes. Si le reste est de ($nbCols-1) ... 
        echo '</tr>'; // ..., on est sur le dernier élément d'une ligne
    $cpt++; // on incrémente le compteur pour savoir où on en est
au départ $cpt = 0 et $nbCols=3
Ça tombe bien c'est ce que je veux faire.
Avant dans le code je ne vois pas à un seul moment $cpt ou $nbCols se modifié.
Donc pour moi cette ligne signifie

Si 0/3==3-1 (ou si 0 est strictement égale à 2), si le résultat est égale à 2, on va à la ligne.
J'ai testé le code, ca va bien à la ligne.

Bon après je suis allez voir ce que voulai dire ce i++ que je vois partout.
Alors en claire c'est un raccourci pour écrire $cpt = $cpt + 2
C'est pas comme ci j'allais le savoir du premier coup, j'apprends, maintenant je sais, je ferai le mec qui trouve ça évident :P

Aussi par habitude j'ai utilisé mysql_fetch_arrow plutot que mysql_fetch_assoc, j'ai regardé dans le manuel :
mysql_fetch_assoc() retourne un tableau associatif qui contient la ligne lue dans le résultat result et déplace le pointeur interne de données. mysql_fetch_assoc() revient à appeler la fonction mysql_fetch_array() avec MYSQL_ASSOC en tant que second paramètre. Cette fonction retourne uniquement un tableau associatif.
Tableau associatif c'est quoi?

Pareil je suis allé voir en quoi MYSQL_ASSOC faisait la petite différence
En utilisant MYSQL_ASSOC, vous ne récupérerez que les indices associatifs (comme le fonctionnement de la fonction mysql_fetch_assoc()), en utilisant MYSQL_NUM, vous ne récupérerez que les indices numériques (comme le fonctionnement de la fonctionmysql_fetch_row()).
indices associatifs, indices numérique?

Je suis également allez voir mysql_fetch_array.
Bon ok j'ai peut-être pas fais epitech ou une autre école d'informatique, mais je pense que indices associatifs/numériques, ça ne veux pas rien dire que à moi :D

Je reviens sur le code :

$cpt++ j'ai bien compris que ça donnai comme calcule :

$cpt = 0
$nbCols = 3
1er boucle :
0/3 = 3-1 (0 = 2), $cpt = 2, on continue
2eme boucle
2/3 = 3-1 (0.66 = 2), $cpt = 4, on continue
3eme boucle
4/3 = 3-1 (1.33 = 2), $cpt = 6, on continue (?? on est déjà à la 3eme photos affiché de la 3eme colonne, et il nous faut une 4eme colonne, la je me plante ok)
4eme boucle
6/3 = 3-2 (2 = 2), bon ça n'a pas de sens ok, vous allez m'expliquez ou je me plante.


Enfin, je dois ajouté une deuxieme ligne dans ma boucle.
Un 2eme <tr> et </tr> au début et à la fin d'une ligne mais pas dans la boucle, mais dans la boucle quand même, c'est encore avec les modulos évidement.
Mais je ne l'ai jamais fais, et je pensai que c'est quelque chose de courant, qu'on apprends avec les exemples, mais ca ne figure dans aucun tuto.
Alors bien sur vous me direz je peux pensé le truc, essayé de faire des tests pour y arriver, mais je n'y arrive pas :S
Je bloque la dessus.
if ($cpt!=0 && $cpt%$nbCols!=0) { // S'il n'y a pas eu assez de cellules dans la boucle pour finir la ligne ...

    echo '<td colspan="'.($nbCols - ($cpt%$nbCols) ).'">&nbsp;</td>'; // ... on complète avec une cellule vide de la bonne taille...

    echo '</tr>'; // ... et on ferme la ligne
Si le compteur n'est pas égale à 0 et le compteur/3 n'est pas égale à 0 (comment le compteur peut être à 0 a la fin, on viens de l'incrémenter plein de fois sans le remettre à 0, j'en conclu que cette ligne est obselete et que seul le second paramètre est utile, mais ensemble avec &&, il ne se passera rien. je sais que ce n'est pas obselete, mais je n'arrive pas à comprendre.
Dans ce cas on rajoute une colonne qui est fusionner avec celle qui manque : 3 - ($cpt/3) => si $cpt = 4, 4/3 = 0.66, on va crée une colonne de 3-0.66 ?
Bon après on ferme la ligne logiquement.

Voila svp un peu d'explication car c'est ce qui me dérangeai en lisant ce tuto, c'est que je devais tout détaillé pour expliquez que j'arriverai à rien par moi même si je ne comprends pas, et en l'occurence, le tutos m'a pas plus a cause de toute ses interrogations.

Merci :P

ViPHP
ViPHP | 2287 Messages

01 avr. 2010, 20:57

Merci pour tous ces retours :D
Alors je coince ici.
Je comprend pas qu'est ce que ça signifie.
if ($cpt%$nbCols==($nbCols-1)) // on divise le nb d'élément par le nb de colonnes. Si le reste est de ($nbCols-1) ... 
        echo '</tr>'; // ..., on est sur le dernier élément d'une ligne
    $cpt++; // on incrémente le compteur pour savoir où on en est
au départ $cpt = 0 et $nbCols=3
Ça tombe bien c'est ce que je veux faire.
Avant dans le code je ne vois pas à un seul moment $cpt ou $nbCols se modifié.
Donc pour moi cette ligne signifie

Si 0/3==3-1 (ou si 0 est strictement égale à 2), si le résultat est égale à 2, on va à la ligne.
J'ai testé le code, ca va bien à la ligne.
Oulàlà, on va reprendre gentiment le modulo. Tu as bien compris que ça avait un rapport avec la division, mais peut-être pas celui que tu crois ;)

Rappelle toi quand on t'a appris la division pour la toute première fois (en CM2 si tu as fait l'école primaire en France), il s'agissait à l'époque de division entière (bah oui, en CM2 les nombres à virgule on connaissait pas). On te faisait noter une sorte de grand T comme ceci (je prends exprès un exemple qui ne tombe pas juste : on divise 17 par 5).
17 | 5
   +---
   | 3      (reste : 2)
L'opération est simple, 17 divisé par 5 vaut 3 avec un reste de 2.
17 est le quotient, 5 le diviseur, 3 est le résultat et 2 est le reste.

L'opérateur modulo, qui est noté en php sous la forme d'un signe %, fonctionne de cette manière, mais il a pour objectif de te donner directement le reste (ou modulo) de la division entière. Autrement dit :
echo 17%5; // Va afficher 2 !
Ok, je suppose que tu as bien compris le modulo maintenant. Et en quoi c'est intéressant pour notre affichage en tableau ce truc matheux bizarre ?

Cette fois il faut imaginer qu'on se situe dans une boucle contenant un nombre inconnu d'éléments (un résultat de requête SQL par exemple, mais pour cette fois on va "tricher" et reprendre notre 17), on sait simplement qu'on veut afficher ces éléments dans un tableau dont le nombre de colonnes est, lui, connu à l'avance (pour continuer sur l'exemple, disons 5 colonnes).

Notre boucle va donc être parcourue 17 fois. Pour que l'élément traité par la boucle soit différent à chaque fois (ce serait bête quand même de faire 17 fois le même affichage non ?) on utilise un "curseur numérique", c'est un simple nombre qu'on augmente de 1 à chaque passage. La seule difficulté est qu'on fait commencer ce nombre non pas à un, mais à zéro. Ce nombre va donc varier de 0 à 16.

Regardons ce que donne l'opérateur modulo (avec un diviseur de 5) pour chacun de ces nombres :
nombre | nombre modulo 5
-------+----------------
0      | 0
1      | 1
2      | 2
3      | 3
4      | 4
5      | 0
6      | 1
7      | 2
8      | 3
9      | 4
10     | 0
11     | 1
12     | 2
13     | 3
14     | 4
15     | 0
16     | 1
Ca devient intéressant non ? Tu ne vois toujours pas où je veux en venir ? Voici donc la même chose, présentée autrement :
         +----+----+----+----+----+
Colonnes | 0  | 1  | 2  | 3  | 4  |
         +----+----+----+----+----+
         | 0  | 1  | 2  | 3  | 4  |
         | 5  | 6  | 7  | 8  | 9  |
         | 10 | 11 | 12 | 13 | 14 |
         | 15 | 16 |    |    |    |
         +----+----+----+----+----+
Notre tableau n'est donc plus très loin ;)

En espérant ne pas t'avoir perdu en chemin (sinon tu hurles bien fort :lol: ), je répondrai au reste de tes questions dans un prochain post.
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 116 Messages

01 avr. 2010, 21:40

Ouf, j'ai compris merci, c'étais claire, j'ai failli répondre que je ne comprenais encore pas mais je me trompai de calculs.

Et maintenant ceci explique cela, mais cela n'explique pas comment faire un retour à la ligne pour affiché en dessous de chaque photos leur descriptions.

Merci pour l'explication, je pense que je mettais pas beaucoup creuser le crane, ça m'apprendra de survoler ce qui me parait anodin!

ViPHP
ViPHP | 2287 Messages

01 avr. 2010, 22:26

Bon après je suis allez voir ce que voulai dire ce i++ que je vois partout.
Alors en claire c'est un raccourci pour écrire $cpt = $cpt + 2
C'est pas comme ci j'allais le savoir du premier coup, j'apprends, maintenant je sais, je ferai le mec qui trouve ça évident :P
$i++;
//est équivalent à
$i=$i+1;
C'est exactement la même chose, en + court. Ce raccourci d'écriture est très utilisé dans les boucles.
Aussi par habitude j'ai utilisé mysql_fetch_arrow plutot que mysql_fetch_assoc, j'ai regardé dans le manuel :
mysql_fetch_assoc() retourne un tableau associatif qui contient la ligne lue dans le résultat result et déplace le pointeur interne de données. mysql_fetch_assoc() revient à appeler la fonction mysql_fetch_array() avec MYSQL_ASSOC en tant que second paramètre. Cette fonction retourne uniquement un tableau associatif.
Tableau associatif c'est quoi?

Pareil je suis allé voir en quoi MYSQL_ASSOC faisait la petite différence
En utilisant MYSQL_ASSOC, vous ne récupérerez que les indices associatifs (comme le fonctionnement de la fonction mysql_fetch_assoc()), en utilisant MYSQL_NUM, vous ne récupérerez que les indices numériques (comme le fonctionnement de la fonctionmysql_fetch_row()).
indices associatifs, indices numérique?

Je suis également allez voir mysql_fetch_array.
Bon ok j'ai peut-être pas fais epitech ou une autre école d'informatique, mais je pense que indices associatifs/numériques, ça ne veux pas rien dire que à moi :D
C'est moins compliqué que ça en a l'air, mais comme c'est "la base" va falloir que j'explique ça comme à l'école ;)

Au sens très large, dans les langages de programmation, ce qu'on appelle un tableau c'est une suite de paires clé-valeur :
- Suite dans le sens ou il y en a plusieurs, et donc il y a un ordre.
- Paires clé-valeur : Tout élément du tableau est une valeur, mais à chaque valeur est associée une clé unique qui permet de la retrouver dans le tableau, donc chaque élément du tableau est en fait un couple : clé + valeur.

Regarde le premier exemple de la page de manuel de la fonction print_r() pour "voir" de quoi on parle.

On fait aussi la différence entre deux grands types de tableaux : les tableaux dont les clés sont des nombres, et les tableaux dont les clés sont des chaînes de caractères. Les premiers s'appellent des tableaux indexés numériquement, les seconds s'appellent tableaux associatifs (ou hash).

Imagine par exemple que tu stockes une liste de personnes dans un tableau. Le choix de la clé que tu vas utiliser est important, car selon le type de clé tu pourras soit écrire du code du style "retourne moi dans cette liste la personne numéro 114" ou encore "retourne moi dans cette liste Monsieur Jacques Dupont". C'est pas tout à fait la même chose.

Là où ça devient un peu compliqué c'est qu'en PHP il n'y a pas de frontière entre ces deux types de tableaux. Un tableau peut être soit l'un, soit l'autre, ou même les deux à la fois !

Les fonctions mysql_fetch_xxxxxxxxxxx ont toutes le même but : te retourner un enregistrement d'une table de ta base de données. Cet enregistrement est une suite de champs, donc c'est tout à fait naturel de vouloir le récupérer dans ton code en tant que tableau. Par contre selon la manière dont tu vas l'utiliser, tu vas peut-être préférer un style de tableau ou bien un autre (mais pour ne pas faire de suspense inutile, je peux te le dire tout de suite : dans presque tous les cas on préfère le tableau associatif, car il associe le nom du champ à sa valeur, et ça rend ton code beaucoup + lisible).


Voilà en gros. Je ne reprends pas le reste de ton post car tu es maintenant beaucoup mieux armé pour relire, et bien comprendre, le tuto de Ryle :) N'hésite pas à aller lire les premières sections du manuel PHP pour approfondir tout ça si c'est toujours pas clair.
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 116 Messages

01 avr. 2010, 22:52

Merci pour l'explication, c'est toujours plus claire qu'avant.

Maintenant j'ai compris le tuto du début à la fin.
Mais cela n'empêche pas que je reste bloqué pour faire une deuxième ligne.
J'arrive pas à imaginer la méthode même avec ce que j'ai appris pour affiché une seconde ligne dans le même tableau.

Pour le moment j'arrive à afficher les 12 images, par colonne de trois.
Et 4 lignes.
Il faudrait rajouté 1 ligne en dessous de chaque ligne existante, pour rajouté les détails de la photos (en dessous de la photos quoi).

Merci en tout cas pour vos explications, je continue de rafraichir le post car j'aurai bien aimé avoir la réponse avant d'aller dormir (pour faire de beau rêves :^o )

Il est 3h50 au Vietnam, au pire je repasserai à mon réveille :P

ViPHP
ViPHP | 2287 Messages

01 avr. 2010, 23:14

Mais cela n'empêche pas que je reste bloqué pour faire une deuxième ligne.
J'arrive pas à imaginer la méthode même avec ce que j'ai appris pour affiché une seconde ligne dans le même tableau.
Ah oui désolé.

Eh bien c'est ultra simple, il te suffit d'ajouter la balise <br> juste après le lien pour provoquer un retour à la ligne, et ensuite d'afficher le texte que tu veux (le tout en restant dans la cellule, donc au sein du <td>.....</td>).
if(!@work()){ Nespresso(); } else { what(); }
______________________________

ViPHP
AB
ViPHP | 5818 Messages

02 avr. 2010, 00:25

Et puis une cellule <td></td> peut contenir un peu ce que l'on veut, y compris si besoin un tableau... ou des élements <div> ... <p> etc.
Enfin je dis cela en cas de besoin. La plupart du temps, comme l'a dit Calimero, un simple br pour aller à la ligne peut suffire pour faire sa mise en page.

Eléphant du PHP | 116 Messages

02 avr. 2010, 09:02

Merci à tous.

Bon j'ai adopté la solution de rajouté un tableau dans mon TD.

Pour la mise en page, j'avais besoin d'un autre tableau.
Ce qui est dommage, c'est que finalement je ne saurai pas si une solution pour faire ce que je voulais faire à la base existe. (2 tr dans une boucle).

Enfin cela dit, au moins la page est terminer et je peux passé à autre chose.

merci

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

02 avr. 2010, 16:34

Modération :
Si ta question est résolue, pense à l'indiquer pour que les futures personnes qui voudront consulter ce sujet sachent qu'il contient une solution.
Tu peux réaliser cette opération toi-même en cliquant sur le bouton Image en haut à droite de la réponse qui te semble la plus pertinente.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer