Il y a encore beaucoup de choses à voir.
Les Array (ou "Variables tableaux") sont très souvent utilisés pour faire des scripts un petit peu plus complexes. Ils sont bien souvent la solution simple à des problèmes qui ont l'air compliqués.
Jusqu'ici, on a fait qu'une première approche avec les Array, juste ce dont on avait besoin pour la base de données (pour rappel, on récupère les données de la base sous forme d'array). Ici, on va faire la "suite" du premier chapitre sur les array.
On va voir dans ce chapitre comment explorer le contenu d'un array (c'est-&agarve;-dire lister tout ce qu'il y a dedans), mais on verra aussi comment faire des recherches dedans, et enfin comment transformer une chaîne en un array.
Mêùe si ce chapitre n'est pas passionnant, il est essentiel car on travaille beaucoup sur les array.
Sommaire
Explorer un array
Avant tout, petit rappel et un peu de vocabulaire.
Quelques rappels
Un array, c'est une variable qui se présente sous la forme de tableau.
Il y a deux types d'array :
- Les array numérotés : chaque morceau de l'array a un numéro. Ne pas oublier que le numéro part de 0.
- Les array associatifs : au lieu d'avoir des numéros, on a des "étiquettes". Chaque morceau de l'array a donc un nom.
Rappel de comment on crée un array :
Code PHP
<?php
// on crée notre array $coordonnees
$coordonnees = array (
'prenom' => 'François',
'nom' => 'Dupont',
'adresse' => '3 Rue du Paradis',
'ville' => 'Marseille');
?>
2 mots de vocabulaire à connaître :
- Prénom, Nom, Adresse et Ville sont les clés. Dans un tableau associatif, une clé permet de repérer un élément.
- François, Dupont, 3, rue du Paradis et Marseille sont les valeurs. Ainsi, "François" est associé à la clé "Prénom".
On va voir deux moyens d'explorer un array :
Afficher rapidement un array : print_r
On a un array et on se demande ce qu'il contient.
Pour afficher le contenu de l'array, on va utiliser la commande print_r. C'est une sorte de
echo spécialisé dans les array.
Cette commande a toutefois un défaut : elle ne renvoit pas de code HTML comme <br /> pour les retours à la ligne. Pour bien voir les Entrées, il faut donc utiliser la balise HTML <pre> qui nous permettra d'avoir un affichage plus correct.
Reprenons l'exemple déjà utilisé dans le chapitre 1. On crée d'abord manuellement un array avec la fonction
array, puis on affiche son contenu avec
print_r :
Code PHP
<?php
$coordonnees = array (
'prenom' => 'François',
'nom' => 'Dupont',
'adresse' => '3 Rue du Paradis',
'ville' => 'Marseille');
echo '<pre>';
print_r($coordonnees);
echo '</pre>';
?>
Facile à condition de ne pas oublier la balise <pre>.
A quoi ça sert concrètement ? On n'affiche pas le contenu d'un array à nos visiteurs.
Cela sert lorsque l'on veut tester un script qui ne marche pas et qu'on veut savoir rapidement ce que contient un array.
Un autre exemple : on fait une requête à MySQL et on aimerait savoir rapidement ce que ça renvoit. Plutôt que de s'embêter à mettre en forme soi-même les résultats en HTML, on fait un print_r qui permettra de voir rapidement ce que ça donne.
Pour cet exemple, je reprends la table
jeux_video qu'on a utilisé dans la partie II :
Code PHP
<?php
mysql_connect("localhost", "alain33", "mot_de_passe");
mysql_select_db("coursphp");
$reponse = mysql_query("SELECT * FROM jeux_video WHERE possesseur='Patrick'");
while ($donnees = mysql_fetch_array($reponse) )
{
echo '<pre>';
print_r($donnees);
echo '</pre>';
}
mysql_close();
?>
On peut voir que les array créés par
mysql_fetch_array sont numérotés ET associatifs. On nous donne les deux. Ca fait qu'il y a pas mal de doublons, mais au moins on peut choisir si on préfère travailler sur des numérotés ou des associatifs.
Pour "ma part", avec la base de données je travaille toujours sur des array associatifs, je trouve ça plus clair.
 |
On peut se demander pourquoi on a mis le print_r dans la boucle while ? Tout simplement parce qu'un nouvel array est créé pour chaque entrée : il y a donc autant d'array que d'entrées dans la table ! Si on n'avait pas fait de boucle, on aurait eu seulement l'array correspondant à la première entrée ! |
Parcourir un array dans une boucle : foreach
print_r, ça ne servira pas vraiment dans la pratique. On s'en sert juste pour rechercher des erreurs.
Par contre, la commande
foreach, elle, est vraiment utile dans les scripts. C'est une sorte de boucle for spécialisée dans les array.
foreach va passer en revue chaque ligne du tableau, et lors de chaque passage, il va mettre la valeur de cette ligne dans $element.
Pour comprendre, un exemple :
Code PHP
<?php
$coordonnees = array (
'prenom' => 'François',
'nom' => 'Dupont',
'adresse' => '3 Rue du Paradis',
'ville' => 'Marseille');
foreach($coordonnees as $element)
{
echo $element . '<br />';
}
?>
foreach va mettre tour à tour dans la variable $element le prénom, le nom, l'adresse et la ville contenus dans l'array $coordonnees.
On met donc entre parenthèses :
- D'abord le nom de l'array (ici $coordonnees)
- Ensuite le mot-clé "as" (qui signifie quelque chose comme "en tant que")
- Enfin le nom d'une variable qu'on choisit qui va contenir tour à tour chacun des éléments de l'array (ici $element).
Entre les accolades, on n'utilisera donc que la variable $element.
La boucle s'arrête lorsqu'on a parcouru tous les éléments de l'array.
Toutefois, avec cet exemple on ne récupère que la valeur.
Si on veut aussi récupérer la clé de l'élément, on écrira :
Code PHP
<?php
$coordonnees = array (
'prenom' => 'François',
'nom' => 'Dupont',
'adresse' => '3 Rue du Paradis',
'ville' => 'Marseille');
foreach($coordonnees as $element)
{
echo '[' . $cle . '] vaut ' . $element . '<br />';
}
?>
De cette façon, on a dans la boucle la clé ET la valeur.
Bien entendu, si on n'a besoin que de la valeur, il vaut mieux utiliser l'exemple précédent.
foreach, c'est un truc vraiment pratique ! Autant on n'utilisera presque jamais
print_r, autant
foreach sera utile dans nos scripts PHP !
On l'utilisera dans un prochain chapitre ou TP…
Rechercher dans un array
On va maintenant faire des recherches dans des array. Cela sera parfois très utile pour savoir si notre array contient ou non certaines informations.
On va voir trois types de recherches :
array_key_exists
: pour vérifier si une clé existe dans l'array
in_array
: pour vérifier si une valeur existe dans l'array
array_search
: pour récupérer la clé d'une valeur dans l'array
Vérifier si une clé existe dans l'array : array_key_exists
Le problème : on a un array, mais on ne sait pas si la clé qu'on cherche est dedans.
Pour cela, n va utiliser la fonction
array_key_exists.
On doit lui donner d'abord le nom de la clé à rechercher, puis le nom de l'array dans lequel on fait la recherche :
array_key_exists("Clé", $array)
La fonction renvoie un booléen, c'est à dire true (vrai) si la clé est dans l'array, et false (faux) si la clé ne se trouve pas dans l'array. Ca nous permet de faire un test facilement avec un if :
Code PHP
<?php
$coordonnees = array (
'prenom' => 'François',
'nom' => 'Dupont',
'adresse' => '3 Rue du Paradis',
'ville' => 'Marseille');
if (array_key_exists("Nom", $coordonnees))
{
echo 'La clé "Nom" se trouve dans les coordonnées !';
}
if (array_key_exists("Pays", $coordonnees))
{
echo 'La clé "Pays" se trouve dans les coordonnées !';
}
?>
En essayant, on ne trouve que "Nom", et pas "Pays" (logique). Seule la première condition a donc été exécutée.
Vérifier si une clé existe dans l'array : in_array
Idem que
array_key_exists, mais cette fois on recherche dans les valeurs.
in_array renvoit true si la valeur se trouve dans l'array, false si elle ne s'y trouve pas.
Pour changer un peu de notre array $coordonnees, on va créer un nouvel array (numéroté) composé de fruits
Code PHP
<?php
$fruits = array ("Banane", "Pomme", "Poire", "Cerise", "Fraise", "Framboise");
if (in_array("Myrtille", $fruits))
{
echo 'La valeur "Myrtille" se trouve dans les fruits !';
}
if (in_array("Cerise", $fruits))
{
echo 'La valeur "Cerise" se trouve dans les fruits !';
}
?>
On ne voit que le message pour la Cerise, tout simplement parce que in_array a renvoyé true pour "Cerise" et false pour "Myrtille".
Facile, rapide, efficace !
Récupérer la clé d'une valeur dans l'array : array_search
array_search fonctionne comme
in_array : il travaille sur les valeurs d'un array. Voilà ce que renvoit la fonction :
- Si elle a trouvé la valeur, array_search renvoit la clé correspondante (c'est-à-dire le numéro si c'est un array numéroté, ou le nom de la clé si c'est un array associatif).
- Si elle n'a pas trouvé la valeur, array_search renvoit false (comme in_array).
En reprenant l'array numéroté avec les fruits :
Code PHP
<?php
$fruits = array ("Banane", "Pomme", "Poire", "Cerise", "Fraise", "Framboise");
$position = array_search("Fraise", $fruits);
echo '"Fraise" se trouve en position ' . $position . '<br />';
$position = array_search("Banane", $fruits);
echo '"Banane" se trouve en position ' . $position . '<br />';
?>
 |
Ne pas oublier qu'un array numéroté commence à 0 ! |
Donc avec ces fonctions, on saura si nos array contiennent certaines valeurs et où elles se trouvent.
Transformer une chaîne en array
En PHP, il existe une fonction très pratique qui permet de créer un array automatiquement à partir d'une chaîne.
Supposons qu'on ait une variable $date qui contienne "05/08/1985". On aimerait extraire le jour, la date et l'année et mettre ça dans un array. A priori, c'est compliqué parce qu'on ne sait pas bien si le numéro du jour a un ou deux chiffres, pareil pour le mois, et sans parler de l'année.
Cette chaîne a quelque chose de particulier : elle est séparée par des slashs (
/). Le slash joue ici le rôle de séparateur, c'est-à-dire qu'il "sépare" la chaîne en plusieurs parties.
Avec la fonction
explode, on peut transformer cette chaîne en un array à 3 éléments (on dit qu'on la fait "exploser"). Il suffit simplement d'indiquer la chaîne et le séparateur (ici le slash), et la fonction nous retourne alors un array numéroté qui contiendra le jour, le mois et la date.
Concrètement, ça donne :
Code PHP
<?php
$chaine_date = '05/08/1985'; // on a une chaîne
$array_chaine = explode('/', $chaine_date); // on transforme cette chaîne en array
// Puis on peut afficher le contenu de l'array
// Ici je fais un print_r, c'est plus rapide ;o)
echo '<pre>';
print_r($array_chaine);
echo '</pre>';
?>
print_r permet de bien voir quelle tête a notre array : on voit bien qu'il est découpé maintenant en 3 parties numérotées de 0 à 2. Dans un script, c'est beaucoup plus pratique de manipuler séparément le jour, le mois et la date, plutôt que toute la chaîne en entier.
Dans la pratique, on a régulièrement besoin de la fonction
explode. Il faut dire qu'elle fait si bien les choses, que la seule chose qu'on pourrait lui reprocher c'est de ne pas l'avoir connue plus tôt.
 |
Il existe aussi une fonction implode qui fait l'inverse de explode (elle transforme un array en chaîne). Elle s'utilise de la même manière, mais on en a besoin un peu moins souvent. |