Dans ce chapitre je vais évoquer les tableaux de valeurs c'est à dire les variables complexes (les "arrays" en anglais).

Rappel : les variables simples

Dans le chapitre précédent ("quelques bonnes raisons d'utiliser PHP") j'ai déjà abordé la notion de variable PHP.
Rappelez vous la table de multiplication par 8.

Le code PHP contenu dans cette page :

<?php for ($i=1; $i<=50; $i++) { $produit = 8 *$i ; echo "<tr>"; echo "<td>8</td>"; echo "<td>". $i ."</td>"; echo "<td>" . $produit ."</td>"; echo "</tr>" ; } ?>

$i et $produit sont des variables simples (ou élémentaires) PHP.
Donc le nom d'une variable doit impérativement commencer par le caractère $ !
Ici les deux variables sont de type int (entier).

Les variables simples présentent un gros inconvénient : on ne peut stocker à la fois qu'une seule valeur !
Alors qu'avec les variables "tableau" on peut stocker plusieurs valeurs à la fois.

Les tableaux indicés

Le code de la partie BODY :

<h3> <?php //création d'un tableau numéroté : première solution $equipe1 =array ('Louis', 'Daniel', 'Marc', 'François', 'Patrick', 'Benoît'); // création d'un tableau indicé : deuxième solution $equipe2[0] = 'Lionel'; $equipe2[1] = 'Denis'; $equipe2[2] = 'Marcel'; $equipe2[3] = 'Frédéric'; $equipe2[4] = 'Paul'; $equipe2[5] = 'Bernard'; //traitement du premier tableau echo "capitaine de l'équipe 1 :" . $equipe1[0]. "<br>" ; echo "liste des membres de l'équipe 1 :" . "<br>"; foreach ($equipe1 as $element) { echo $element . "<br>" ; } // traitement deuxième tableau echo "<hr>"; // afficher le capitaine deuxième équipe [ echo "capitaine de l'équipe 2 :" . $equipe2[0]. "<br>" ; // changement de capitaine ! echo "Changements !" . "<br>"; $equipe2[0] = 'Paul' ; $equipe2[4] = 'Lionel' ; echo "liste des membres de l'équipe 2 :" . "<br>"; foreach ($equipe2 as $indice=> $contenu) { echo $indice. " :" . $contenu ."<br>" ; } ?> </h3>

Je vous montre les deux façons de créer un tableau indicé.
Dans le premier cas j'utilise le mot réservé array suivi de la liste de toutes les valeurs du tableau.
Louis est le premier élément ; il aura l'indice (ou numéro) 0 !
la première case d'un tableau indicé a toujours le numéro zéro !

Dans le deuxième cas j'affecte à chaque case une valeur ; pour préciser chaque case il suffit d'indiquer le nom du tableau suivi de l'indice (entre crochets). Avec cette syntaxe je peux afficher / modifier le contenu d'une case.

Dans les deux cas le tableau a un nom qui comme toute variable PHP commence par $ !

Pour parcourir un tableau (lire successivement chaque case) PHP propose la structure foreach.
Pour le premier tableau je me contente d'afficher les contenus des différentes cases ($element) alors que pour le deuxième tableau j'affiche pour chaque case ($indice) son numéro suivi de son contenu ($contenu).
Testez ce code !

Les tableaux associatifs

Chaque élément est identifié non pas par un numéro mais pas un nom (une clé).
On a donc des paires de "clé-valeur" !

Exemple : pour identifier un individu on utilise son nom, son prénom et sa civilité (Monsieur ou Madame).

Dans la page ci-dessous on décrit sous forme de tableaux associatifs deux personnes.

Le code de la partie BODY :

<h3> <?php // premier tableau associatif $coordonnees_jeannot = array('nom' =>'Jeannot','prenom' =>'louis','civilite' =>'Mr'); // deuxième tableau associatif $coordonnees_dupont['nom'] = 'Dupont'; $coordonnees_dupont['prenom'] = 'marie'; $coordonnees_dupont['civilite'] = 'Mme'; // parcourir premier tableau sans afficher les clés echo "Coordonnées de Jeannot :" . "<br>" ; foreach ($coordonnees_jeannot as $element) { echo $element. "<br>" ; } // parcourir deuxième tableau avec affichage des clés echo "<hr>"; echo "Coordonnées de Dupont :" . "<br>" ; foreach ($coordonnees_dupont as $cle=> $contenu) { echo $cle . " : " .$contenu. "<br>" ; } ?> </h3>

Revenons sur la première méthode.
'nom' =>'Jeannot' : la première case a pour clé "nom" et pour contenu "Jeannot".
Remarquez l'opérateur "=>" utilisé dans cette syntaxe.

Quant à l'affichage du contenu, pour le premier tableau j'affiche pour chaque paire seulement la valeur ($element) alors que pour le deuxième tableau j'affiche pour chaque paire la clé ($cle) puis la valeur ($contenu).
Testez ce code !

Compléments sur les tableaux

Il y a de très nombreuses fonctions PHP que l'on peut associer aux tableaux.

Les tableaux indicés

Le code de l'exemple (partie body):

<h3> <?php $notes = array(12,8,7,11,5,9,6,10); echo "<hr>"; echo "affichage du tableau numéroté :<br>"; print_r($notes); //ajout au tableau $notes[]=13; $notes[]=4; echo "<hr>"; echo "affichage du tableau suit aux ajouts :<br> "; print_r($notes); // taille du tableau echo "<hr>"; $n = count($notes); echo "nouvelle taille du tableau :" . $n ; // moyenne des notes echo "<hr>"; $somme = array_sum($notes); echo "cumul des notes :" . $somme . "<br>" ; $moyenne = $somme /$n ; echo "moyenne des notes :" . $moyenne ; // tri du tableau numéroté sort($notes); // affichage du tableau après tri echo"<hr>"; foreach ($notes as $contenu) { echo $contenu. "<br>" ; } // déplacement du pointeur echo "<hr>"; end($notes); echo "dernier élément :" .current($notes) ."<br>"; reset($notes); echo "premier élément : " .current($notes)."<br>" ; ?> </h3>

La fonction print_r(nomtableau) permet d'afficher un tableau. Mais comme vous pourrez le constater en essayant ce code l'affichage n'est pas très joli mais c'est très pratique en phase de production du code.
La fonction count(nomtableau) retourne le nombre d'éléments d'un tableau.
La fonction array_sum(nomtableau) additionne les valeurs numériques d'un tableau.
La fonction sort(nomtableau) permet de trier par valeurs les éléments d'un tableau.
La fonction end(nomtableau) permet de pointer le dernier élément.
La fonction reset(nomtableau) permet de pointer le premier élément.
Il existe aussi les fonctions next et previous.
La fonction current(nomtableau) retourne la valeur de l'élément pointé.
Essayez ce code !

Notez que j'ai réussi à produire la moyenne simple des notes en combinant les fonctions array_sum, count

Les tableaux associatifs

Le code de l'exemple (partie body) :

<?php $capitales = array('fr' =>'Paris','gb' =>'Londres','al' =>'Berlin','es' =>'Madrid'); echo "<hr>"; echo "affichage du tableau :<br>"; print_r($capitales); echo "<hr>"; // ajout au tableau $capitales['be'] = "Bruxelles"; $capitales['it'] = "Rome"; echo "affichage du tableau après ajouts :<br>"; print_r($capitales); // taille du tableau echo "<hr>"; $n = count($capitales); echo "nouvelle taille du tableau :" . $n ; // tri du tableau asort($capitales); echo"<hr>"; echo "affichage du tableau trié :<br>" ; foreach ($capitales as $cle=> $contenu) { echo $cle . " : " .$contenu. "<br>" ; } // déplacement du pointeur echo "<hr>"; end($capitales); echo "dernier élément : " .current($capitales) ."<br>"; reset($capitales); echo "premier élément : " .current($capitales)."<br>" ; ?> </h3>

Attention pour trier un tableau associatif il faut utiliser la fonction asort(nomtableau).
Essayez ce code !

Tableaux découlants des envois

Le tableaux associatif $_GET (ou $_POST) est dans le jargon PHP une variable superglobale.
Les variables superglobales sont des tableaux associatifs qui sont créés automatiquement par PHP dans certaines circonstances. Ainsi dans la page précédente j'ai évoqué la variable superglobale $_SERVER créée par le serveur à l'occasion d'une requête HTTP. Il existe aussi $_COOKIE et $_SESSION.
Les variables superglobales sont accessibles partout et doivent être écrites en majuscules !

Mais revenons au traitement PHP des données d'un formulaire.

Ci-dessous page de connexion à site pour lequel vous êtes déjà inscrit (code de la partie BODY):

<form action = "#" method ='get'> <p>Vous devez saisir votre adresse mail en guise d'identifiant et choisir un mot de passe.</p> <label>Tapez votre adresse mail : </label> <input type = "email" required placeholder = "n'oubliez pas @" name ='mail'> <label>Saisissez mot de passe :</label> <input type = "password" required pattern ='[A-z]{6,8}' maxlength ='8' placeholder = 'entre 6 et 8 lettres non accentuées' name ='passe'> <label></label><button type = 'submit'>connexion</button> </form> <h3> <?php if (isset($_GET['mail'])) { echo "votre identifiant : " . $_GET['mail'] . "<br>" ; echo "le mot de passe : " . $_GET['passe'] . "<br>" ; } else echo "renseignez le formulaire !" ; ?> </h3>

La valeur de l'attribut action est # ce qui veut dire que la page "cible" est celle qui contient le formulaire !
Les données saisies ne peuvent être soumissionnées que si elles correspondent au type de champ et au gabarit (valeur de l'attribut pattern).
Ainsi le champ nommé "mail" est de type "email" donc la soumission ne sera possible que la saisie contient le caractère @ !
Pour le champ nommé "passe" une expression régulière ([A-z]{6,8}) précise qu'il faut saisir entre 6 et 8 lettres majuscules ou minuscules non accentuées.

Donc après soumission il est créé dans la même page le tableau $_GET (puisque la méthode d'envoi est GET).
Respectez la casse : GET en majuscules !
Il s'agit d'un tableau associatif avec deux éléments ayant pour clés : mail et passe

Les clés correspondent aux noms des champs du formulaire.

Je reviendrai sur le test basé sur la fonction isset.
Sachez simplement pour le moment que sans ce test la page risque d'afficher au départ un message d'erreur ... (ça dépend de la configuration de PHP chez le serveur).
Le traitement PHP consiste ici à afficher simplement les contenus des deux cases du tableau associatif $_GET
Dans la réalité il y aurait recherche de l'identifiant saisi dans la base de données puis comparaison entre mot de passe saisi et mot de passe stocké (dans la base).
Testez ce code !

Avez vous observé la barre d'adresse ?
Si non, recommencez le test !
Alors ?
Oui il y a un hic. Les paramètres apparaissent dans la barre d'adresse dont le mot de passe. C'est génant !
Rassurez vous avec la méthode d'envoi POST cet inconvénient disparaît.
Retour menu