1) Les Array II : le Retour
Transcription
1) Les Array II : le Retour
Les Array II : le Retour - Site Web - Lecture du tutorial - Le Site du Zéro 1 sur 9 http://www.siteduzero.com/tuto-3-164-1-les-array-ii-le-retour.html Les Array II : le Retour Vous les croyiez disparus ? Oubliés ? Enterrés ? Que nenni ! Les Array reviennent, et ils sont pas contents Auteur : M@teo21 Créé le : 20/08/2005 à 00h19 Modifié le : 01/11/2005 à 18h39 Noter et commenter ce tutorial Imprimer ce tutorial Plus sérieusement, les Array (ou "Variables tableaux") sont très souvent utilisés lorsque vous vous mettez à 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, nous n'avons vu que très rapidement les Array, juste ce dont on avait besoin pour la base de données (car je vous rappelle qu'on récupère les données de la base sous forme d'array). Aujourd'hui, nous allons faire en quelque sorte la "suite" du premier chapitre sur les array. Je vous recommande d'aller le relire d'ailleurs, histoire d'être bien à jour. Nous allons voir dans ce chapitre comment explorer le contenu d'un array (c'est-à-dire lister tout ce qu'il y a dedans), mais nous verrons aussi comment faire des recherches dedans, et enfin nous verrons comment transformer une chaîne en un array. Honnêtement, ce chapitre ne sera pas une révélation passionnante et vous ne saurez pas faire des trucs super-géniaux après l'avoir lu. Mais ce sont des connaissances qu'il faut avoir en PHP, car on travaille fréquemment sur les array. Et ne vous découragez pas, parce que le meilleur est à venir Sommaire du chapitre : Explorer un array Rechercher dans un array Transformer une chaîne en array Q.C.M. Explorer un array Avant de commencer à retravailler sur les array, je pense qu'il serait bien de faire un petit rappel et de vous faire faire un peu de vocabulaire, sinon vous allez vous emmêler les pinceaux bêtement Quelques rappels Un array, c'est une variable qui se présente sous la forme de tableau. Par exemple : $capitale['France']. On a deux types d'array : Les array numérotés : chaque morceau de l'array a un numéro. Ce numéro part de 0 (ne l'oubliez pas, c'est source d'erreurs). Par exemple, $liste[0], $liste[1], $liste[2] etc... Les array associatifs : au lieu d'avoir des numéros, on a des "étiquettes". Chaque morceau de l'array a donc un nom. Par exemple, les array retournés par MySQL sont associatifs : $donnees['pseudo'], $donnees['message'] 29/07/2007 18:22 Les Array II : le Retour - Site Web - Lecture du tutorial - Le Site du Zéro 2 sur 9 http://www.siteduzero.com/tuto-3-164-1-les-array-ii-le-retour.html etc... Je vous rappelle comment on crée un array : Code : PHP <?php // On crée notre array $coordonnees $coordonnees = array ( "Prénom" => "François", "Nom" => "Dupont", "Adresse" => "3, rue du Paradis", "Ville" => "Marseille"); ?> Enfin, voici 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". Nous allons voir deux moyens d'explorer un array : Le print_r Le foreach Afficher rapidement un array : print_r La question du jour est : vous avez un array et vous vous demandez 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. Je reprends l'exemple qu'on avait utilisé dans le premier chapitre sur les array. Je crée d'abord manuellement un array avec la fonction array, puis j'affiche son contenu avec print_r : Code : PHP <?php $coordonnees = array ( "Prénom" => "François", "Nom" => "Dupont", "Adresse" => "3, rue du Paradis", "Ville" => "Marseille"); echo '<pre>'; print_r($coordonnees); echo '</pre>'; ?> Essayer ! Voilà, c'est facile à utiliser du temps qu'on n'oublie pas la balise <pre>. Vous vous demandez à quoi ça peut servir concrètement ? C'est vrai que dans la pratique, vous n'afficherez jamais le contenu d'un array à vos visiteurs (ils ne comprendraient pas, les pauvres ^^). En fait, ça vous servira à vous, lorsque vous testez un script qui ne marche pas, et que vous aimeriez savoir rapidement ce que contient un array. Un autre exemple pour que vous voyiez bien comment on s'en sert : vous faites une requête à MySQL et vous aimeriez savoir rapidement ce que ça renvoit. Plutôt que de vous embêter à mettre en forme vous-même les résultats en HTML, vous faites un print_r qui vous permettra de voir rapidement ce que ça donne. Pour cet exemple, je reprends la table jeux_videos qu'on a utilisé dans la partie II de ce cours : 29/07/2007 18:22 Les Array II : le Retour - Site Web - Lecture du tutorial - Le Site du Zéro 3 sur 9 http://www.siteduzero.com/tuto-3-164-1-les-array-ii-le-retour.html Code : PHP <?php mysql_connect("localhost", "mateo21", "mot_de_passe"); mysql_select_db("coursphp"); $reponse = mysql_query("SELECT * FROM jeux_videos WHERE possesseur='Patrick'"); while ($donnees = mysql_fetch_array($reponse) ) { echo '<pre>'; print_r($donnees); echo '</pre>'; } mysql_close(); ?> Essayer ! Ah, d'ailleurs vous pouvez 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. Vous vous demandez 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 c'est bien beau, mais vous avez vu que ça ne vous servirait 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. Je parle chinois ? Ok, alors regardez : Code : PHP <?php $coordonnees = array ( "Prénom" => "François", "Nom" => "Dupont", "Adresse" => "3, rue du Paradis", "Ville" => "Marseille"); foreach($coordonnees as $element) { echo $element . '<br />'; } ?> Essayer ! 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 : 1. D'abord le nom de l'array (ici $coordonnees) 29/07/2007 18:22 Les Array II : le Retour - Site Web - Lecture du tutorial - Le Site du Zéro 4 sur 9 http://www.siteduzero.com/tuto-3-164-1-les-array-ii-le-retour.html 2. Ensuite le mot-clé "as" (qui signifie quelque chose comme "en tant que") 3. Enfin le nom d'une variable que vous choisissez 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 ( "Prénom" => "François", "Nom" => "Dupont", "Adresse" => "3, rue du Paradis", "Ville" => "Marseille"); foreach($coordonnees as $cle => $element) { echo '[' . $cle . '] vaut ' . $element . '<br />'; } ?> Essayer ! Avec cette façon de procéder, vous avez dans la boucle la clé ET la valeur. Bien entendu, si vous n'avez besoin que de la valeur, il vaut mieux utiliser l'exemple précédent Et foreach, croyez-moi, c'est un truc vraiment pratique ! Autant vous n'utiliserez presque jamais print_r, autant le foreach va bientôt devenir votre meilleur ami dans vos scripts PHP ! Apprenez à vous en servir, ce n'est pas bien compliqué. Quant à moi, j'essaierai de vous le faire utiliser au cours d'un prochain chapitre ou TP... Rechercher dans un array Nous allons maintenant faire des recherches dans des array. Cela vous sera parfois très utile pour savoir si votre array contient ou non certaines informations. Nous allons 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 Voici notre problème : on a un array, mais on ne sait pas si la clé qu'on cherche est dedans. On va utiliser pour vérifier ça 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 renvoit 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 29/07/2007 18:22 Les Array II : le Retour - Site Web - Lecture du tutorial - Le Site du Zéro 5 sur 9 http://www.siteduzero.com/tuto-3-164-1-les-array-ii-le-retour.html <?php $coordonnees = array ( "Prénom" => "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 !'; } ?> Essayer ! Comme vous pouvez le voir, on n'a trouvé que "Nom", et pas "Pays" (logique). Seule la première condition a donc été exécutée Vérifier si une valeur existe dans l'array : in_array Je ne vais passer 50 ans dessus, c'est exactement pareil 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, je vais 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 !'; } ?> Essayer ! 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. Voici 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). On reprend l'array numéroté avec les fruits (ça me donne faim tout ça ): Code : PHP 29/07/2007 18:22 Les Array II : le Retour - Site Web - Lecture du tutorial - Le Site du Zéro 6 sur 9 http://www.siteduzero.com/tuto-3-164-1-les-array-ii-le-retour.html <?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; ?> Essayer ! Je sais que je me répète, mais n'oubliez pas qu'un array numéroté commence à 0 ! Cela explique donc pourquoi "Banane" se trouve en position 0... Voilà donc les fonctions qu'il fallait connaître pour faire une recherche dans un array. Avec ça, vous aurez plus de contrôle sur vos array puisque vous saurez s'ils contiennent certaines valeurs et surtout où elles se trouvent. Transformer une chaîne en array En PHP, il existe une fonction très pratique qui vous permet de créer un array automatiquement à partir d'une chaîne. Supposons que l'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 je vous parle même pas de l'année Mais regardez bien cette chaîne... Elle 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 nous 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>'; ?> Essayer ! C'est pas beau ça ? Le print_r nous permet de bien voir quelle tronche 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. 29/07/2007 18:22 Les Array II : le Retour - Site Web - Lecture du tutorial - Le Site du Zéro 7 sur 9 http://www.siteduzero.com/tuto-3-164-1-les-array-ii-le-retour.html 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. Q.C.M. A quoi sert in_array ? n A savoir si une clé se trouve dans l'array j k l m j A savoir si une valeur se trouve dans l'array k l m n j A savoir la clé d'une valeur dans l'array k l m n Lequel de ces array donne cet affichage si on en fait un print_r ? Code : Autre Array ( [0] => [1] => [2] => [3] => ) Venise Rome Prague Tunis n array('Venise', 'Rome', 'Prague', 'Tunis') j k l m j array('Prague', 'Rome', 'Venise', 'Tunis') k l m n j array('Prague', 'Rome', 'Tunis', 'Venise') k l m n Qu'affiche ce code ? Code : PHP <?php $jeu = array("Pierre", "Feuille", "Ciseaux"); if (in_array("Ciseaux", $jeu)) { if (in_array("Puits", $jeu)) { echo array_search("Puits", $jeu); } else { echo array_search("Feuille", $jeu); } } ?> 29/07/2007 18:22 Les Array II : le Retour - Site Web - Lecture du tutorial - Le Site du Zéro 8 sur 9 http://www.siteduzero.com/tuto-3-164-1-les-array-ii-le-retour.html n Puits j k l m j 1 k l m n j Rien du tout k l m n Que vaut $total à la fin de ce script ? Code : PHP <?php $liste_nombres = array(5, 15, 2, 7, -3); $total = 0; foreach($liste_nombres as $nombre) { $total = $total + $nombre; } ?> n 26 j k l m j 29 k l m n j 27 k l m n Qu'affiche ce code ? Code : PHP <?php $jeu1 = array('Pierre', 'Feuille', 'Ciseaux'); $jeu_chaine = 'Portail%Pierre%Puits'; $jeu2 = explode ('%', $jeu_chaine); $objet_cherche = 'Pierre'; if (in_array($objet_cherche, $jeu1) AND in_array($objet_cherche, $jeu2)) { if (array_search($objet_cherche, $jeu1) == array_search($objet_cherche, $jeu2)) { echo 'Bim'; } else { echo 'Bam'; } } else { echo 'Boum'; } ?> n Bim j k l m j Bam k l m n j Boum k l m n 29/07/2007 18:22 Les Array II : le Retour - Site Web - Lecture du tutorial - Le Site du Zéro 9 sur 9 http://www.siteduzero.com/tuto-3-164-1-les-array-ii-le-retour.html Correction ! Auteur : M@teo21 Noter et commenter ce tutorial Imprimer ce tutorial 29/07/2007 18:22