Cpm Affiliation : la régie publicitaire au Cpm

Le type manquant : les arrays

Dans bien des langages de programmation, un autre type de variables très utile existe : les arrays (ou tableaux).
Les utilisations sont très diverses, mais aussi très simples. En retenant un ou deux points théoriques, vous pourrez faire de grandes choses ! (Je peux vous l'assurer : quand vous commencerez à évoluer par vous-mêmes, vous boufferez des arrays au petit dej')

Faisons connaissance

Si vous avez l'âme bricoleuse, vous avez sans doute une boîte à outils, un genre de boîte qui vous permet de ranger et transporter facilement tous vos outils.

Imaginez-vous un beau matin, le soleil brille, les coqs chantent, le chat ronronne et le chien mâche délicatement votre paire de chaussures préférée. En bon ouvrier que vous êtes, vous allez dans votre atelier pour préparer les outils en prévision de la dure journée de labeur qui se profile.
Manque de chance, vous ne trouvez plus vos outils. En cherchant, vous sortez votre tournevis d'un pot de fleurs, le marteau du dessous de la table, la perceuse pendue au plafond et bien d'autres dans des endroits plus insolites les uns que les autres.
Manque de chance, cette recherche vous a fait perdre beaucoup de temps et vous devez sauter le petit déjeuner, vous êtes alors très grognons.
Un jour, un ami vous amène une invention révolutionnaire : une boîte à outils. Il vous explique son fonctionnement en deux mots : vous rangez vos outils dans cette boîte, vous vous souvenez où est la boîte et ainsi, vous avez tous vos outils à portée de main en un instant.

Heureusement que cet ami est là, car il vient de vous expliquer ce qu'est un array. Schématiquement, on pourrait comparer un array à une boîte à outils. La boîte à outils, c'est l'array. Les compartiments de la boîte à outils, ce sont les index, les clés de l'array (ce qui permet d'associer un nom simple à une expression) et les outils rangés dans les compartiments, ce sont les données, les expressions.

Comme je suis presque sûr que vous n'avez pas suivi cette explication un peu tirée par les cheveux, on va passer à la pratique, ça devrait vous aider à mieux cerner ce qu'est un array. Un petit code pour la route :

Code PHP :

<?php

$var = array('lili', 'lala');
echo $var[0];

Ce code vous affiche « lili », mais comment ça marche ?
Pas de panique : comme toujours, une explication va suivre. Vous avez sous les yeux la façon la plus simple de créer un array et de le remplir avec quelques données ; seulement, ce n'est pas pratique du tout à expliquer, je vais donc vous donner un nouveau code qui est strictement identique au précédent au niveau du résultat, mais qui permettra de mieux comprendre ce que je dis :

Code PHP :

<?php

$var = array(
0 => 'lili',
1 => 'lala'
);
echo $var[0];

Qui es-tu vraiment ?

Après cette brève introduction, voici la définition exacte de ce qu'est un array : une association ordonnée. Une association est un type qui fait correspondre des valeurs à des clés (ou index).

Dans le code précédent, vous voyez quatre lignes :

  • $var = array(
  • 0 => 'lili',
  • 1 => 'lala'
  • );


La première ligne indique qu'on va créer un array via la structure array() et affecter cet array à la variable $var.
La deuxième ligne crée une association dans l'array qui associe la chaîne de caractères « lili » à la clé 0.
La troisième ligne crée une association dans l'array qui associe la chaîne de caractères « lala » à la clé 1.
La dernière ligne marque la fin de la structure (la parenthèse fermante) et la fin de l'instruction (le point-virgule).

Je vous ai dit que ce code était équivalent au premier, mais pourquoi ?
Quand je tape $var = array('lili', 'lala');, l'interpréteur PHP crée un array et l'assigne à la variable $var. On donne les données (les chaînes « lili » et « lala »), mais pas les clés ; or, pour obtenir une association, on doit avoir la valeur ET la clé, l'un ne va pas sans l'autre. C'est pourquoi, lorsque vous tapez cela, l'interpréteur PHP va lui-même attribuer des clés numériques de 0 (les clés commencent à 0 et non à 1, très important !) à n-1 (avec n le nombre de valeurs que vous donnez à la structure array()).

Vous verrez sans doute souvent la distinction entre des arrays associatifs et des arrays à index numériques : cette distinction n'a aucun sens. En effet, que ce soit vous ou l'interpréteur PHP qui donniez les clés à utiliser dans l'array, un array est et sera toujours une liste d'associations.

Maintenant qu'on a créé un array, on est contents, mais si on l'utilisait ? Vous avez vu une autre instruction qui affiche une valeur de l'array : echo $var[0];. Voici la syntaxe de base pour accéder à une valeur d'un array :

Code PHP :

<?php

$var[Expression];

$var est le nom de la variable à laquelle l'array a été affecté, et Expression est l'expression dont la valeur est la clé de l'association à laquelle vous voulez accéder. Rappelez-vous, on crée un array ainsi : $var = array('lili', 'lala');. Pour accéder à la chaîne « lili », qui est associée à la clé 0, l'expression entre les crochets doit avoir l'entier 0 comme valeur : $var[0];.

Comme on doit mettre une expression entre crochets, on peut utiliser beaucoup de choses comme clé. Exemples :

Code PHP :

<?php
$var = array(
'string' => 'bonjour',
4 => 'int',
4.3 => 'float',
NULL => 'null',
'' => 'string vide'
);

echo $var['string'];
echo $var[4];
echo $var[4.3];
echo $var[NULL];
echo $var[''];

?>

Si vous testez ce code, vous verrez des choses étranges.
Vous verrez qu'il affiche deux fois « float » et deux fois « string vide », mais que « int » n'est jamais affiché. Eh bien devinez quoi : c'est normal. Quand vous voulez créer une association avec une clé de type float (nombre à virgule), l'interpréteur PHP transtype ce nombre à virgule en entier (il prend la partie entière).
Ce comportement explique qu'on affiche deux fois « float » et pas « int ». Mais pourquoi ?
C'est simple : quand on veut créer l'association 4.3 => 'float', l'interpréteur PHP trantype 4.3 en 4, l'association qu'on veut créer est donc 4 => 'float'. Seulement, cette clé a déjà été utilisée ! Et de la même façon que pour une variable, l'interpréteur PHP va attribuer la nouvelle valeur à la clé 4.
C'est exactement la même chose pour le null, sauf qu'au lieu d'être transtypé en entier, il est transtypé en chaîne de caractères vide («»).

Un exemple de la puissance des arrays :

Code PHP :

<?php

$pair = array('pair', 'impair');
echo '9 est un nombre ' . $pair[9 % 2];
// même chose avec une fonction (inutile, mais juste pour l'exemple)
function pair($nb)
{
return $nb % 2;
}
echo '10 est un nombre ' . $pair[pair(10)];

Tu commences à me plaire…

Maintenant qu'on a bien vu ce qu'était un array et comment en créer, que penseriez-vous si l'on pouvait ajouter des associations dans un array déjà existant et de modifier les associations qui existent déjà ?

Comme pour la création d'un array, il y a deux façons d'attribuer une clé à une association qu'on veut ajouter à un array qui existe déjà. On peut soit décider nous-mêmes de la clé, soit laisser l'interpréteur PHP faire son choix.

Code PHP :

<?php

$var = array(); // je crée un array vide
$var['lala'] = 'Bonjour'; // j'ajoute l'association 'lala' => 'bonjour' à l'array affecté à $var
$var[] = 'Hello';
// j'ajoute une association, mais je laisse l'interpréteur PHP décider de la clé qui sera utilisée pour cette association
echo $var['lala'] . $var[0];

Mais comment savoir quelle clé l'interpréteur PHP va attribuer à une association ?
C'est très simple. L'interpréteur PHP va rechercher la clé numérique la plus grande (s'il n'y a aucune clé numérique, l'interpréteur PHP utilise l'entier 0 comme clé) et y ajouter 1 pour obtenir la nouvelle clé.

INFORMATION : Si vous essayez d'ajouter une association à un array qui n'existe pas, l'interpréteur PHP va créer l'array et ajouter l'association ; ainsi, ce code est tout à fait correct :

<?php

$tab['truc'] = 'lala';
echo $tab['truc'];

La modification des associations est encore plus simple que cela, on a déjà goûté à ça en réalité. Pour modifier la valeur d'une association, il suffit d'ajouter une association qui utilise la même clé, exemple :

Code PHP :

<?php

$var = array(5 => 'bonjour'); // on crée un array
echo $var[5]; // on affiche la valeur de l'association qui a la clé 5
$var[5] = 'aurevoir';
// on ajoute une association à l'aide d'une clé qui existe déjà, on modifie donc la valeur de cette association
echo $var[5]; // on affiche la nouvelle valeur de l'association qui a la clé 5


Pour supprimer une association d'un array, il faut utiliser la fonction unset() :

<?php

$var = array('lili', 'lala');
echo $var[0];
unset($var[0]); // on supprime l'association qui a la clé 0
echo $var[0]; // affiche une erreur, cette association n'existe plus

INFORMATION : La fonction unset() ne sert pas qu'à supprimer une association d'un array ; en effet, on peut supprimer n'importe quelle variable avec cette fonction, par exemple : unset($var); supprimera la variable $var.

Puisqu'on a eu droit à une belle erreur, en avant-première, une petite explication sur deux erreurs qui peuvent souvent survenir avec les arrays :

Code console :

Notice: Undefined offset: 4 in C:\www\test.php on line 37

Cette erreur indique que vous essayez d'utiliser une clé qui ne correspond à aucune association. Le 4 correspond à la clé que j'ai voulu utiliser, C:\www\test.php est le chemin du fichier qui a généré l'erreur, et 37 le numéro de la ligne qui l'a engendrée. Quand vous avez une erreur, regardez-la toujours attentivement pour savoir à quelle ligne aller chercher la cause de l'erreur (elle peut être une ligne ou deux au-dessus ou en dessous de la ligne indiquée).

Warning: Illegal offset type in C:\www\test.php on line 38

Cette erreur indique que vous essayez de créer une association avec une clé invalide à la ligne 38 du fichier C:\www\test.php.
Ce code-ci générera une erreur similaire :

Code PHP :

<?php

$var = array(); // un array vide
$var[array()] = 5; // erreur, on ne peut pas utiliser un array comme clé d'une association d'un array

Voilà deux erreurs bien courantes. Mais maintenant, on va s'attarder sur une grave erreur de bien des codeurs. Il est possible que vous rencontriez parfois ce genre d'instruction :

<?php

$tab[cle] = 'truc';

Ce bout de code semble anodin, et pourtant, une erreur potentiellement très embêtante s'y est glissée.
En lisant ce code, vous avez dû comprendre qu'on veut créer un array $tab et ajouter l'association cle => 'truc'. Seulement, on a oublié les apostrophes (ou les guillemets) autour de cle, et ce n'est donc pas une chaîne de caractères. Si l'interpréteur PHP était plus strict, votre script planterait totalement en faisant ça, mais manque de chance, il est très laxiste ; en effet, il va convertir cle en une chaîne de caractères et là, plus de problème (mais vous aurez quand même droit à une erreur de la part de l'interpréteur PHP pour vous signaler que quelque chose n'allait pas).
Je ne peux pas vous expliquer en quoi c'est une erreur pour le moment, car on n'a pas encore vu ce qu'était une constante. Retenez juste que quand vous voulez créer une association avec une chaîne de caractères comme clé, vous ne devez jamais oublier les apostrophes ou les guillemets.

Des fonctions et structures bien pratiques

Comme je l'ai dit précédemment, les arrays sont très pratiques, mais c'est uniquement grâce à toutes les fonctions associées que vous utiliserez la pleine puissance de ce type de variables. Je ne vais pas toutes les présenter ici, mais vous pouvez trouver la liste dans cette partie de la documentation PHP.

Pour bien vous mettre en jambes, je vais vous montrer une nouvelle structure de contrôle (souvenez-vous de if, while et do while) : foreach. Cette structure permet de parcourir un array, et c'est plutôt pratique.
Imaginons que vous voulez faire une liste de prénoms et tout afficher d'un coup. Vous mettez les prénoms dans un array, un foreach et tout s'affiche ! Ajouter, modifier ou supprimer un prénom devient alors très simple et rapide, il suffit de modifier l'array. Exemple :

Code PHP :

<?php

$prenom = array('Georges', 'Julien', 'Pierre', 'Marie', 'Audrey', 'Eve');
foreach($prenom as $line)
{
echo $line . ' ';
}

Plutôt puissant, n'est-ce pas ?
Le fonctionnement de foreach est très simple à comprendre. La seule chose qui peut peut-être vous dérouter, c'est ce $line. En fait, pour ne pas dépendre de la clé de l'association, l'interpréteur PHP associe, à chaque tour de boucle, la variable $line à la valeur de l'association qu'il vient de lire (on lit le tableau dans l'ordre des clés, une clé à la fois).

Il se peut que vous ayez besoin de connaître la clé qui correspond aux différentes valeurs ; eh bien soyez rassurés, foreach le permet !

Code PHP :

<?php

$prenom = array('Georges', 'Julien', 'Pierre', 'Marie', 'Audrey', 'Eve');
foreach($prenom as $key => $line)
{
echo 'Clé : ' . $key . '; Valeur : ' . $line . ';<br />';
}

Exactement comme dans le code précédent, $line contiendra la valeur de l'association et $key la clé. Vous pouvez donner n'importe quel nom à ces deux variables ; j'ai choisi key et line parce que les noms parlent d'eux-mêmes.

Es-tu là, petite valeur ?

Parfois, vous aurez besoin de vérifier si une valeur est présente dans un array. Il existe une fonction pour cela : in_array($value, $array) .
Cette fonction retourne true si $value est la valeur d'une des associations de l'array, sinon false. Exemple :

Code PHP :

<?php

$meuh = array('lili', 'lala');
var_dump(in_array('lili', $meuh));
var_dump(in_array('ohéh', $meuh));

Es-tu là, petite clé ?

On vient de voir comment vérifier si une valeur était présente dans l'array, mais pourquoi ne pas aussi vérifier si une clé existe ?
Il y a en réalité deux méthodes : une propre aux arrays et une qui teste l'existence d'une variable en général. La fonction propre aux arrays : array_key_exists($key, $array) .
Cette fonction retourne true si la clé $key existe dans l'array $array, sinon false. Exemple :

Code PHP :

<?php

$l = array(
5 => 'hu',
'beuh' => 'meuh',
7 => 9
);

var_dump(array_key_exists(5, $l));
var_dump(array_key_exists('lala', $l));
var_dump(array_key_exists('beuh', $l));

La seconde méthode, la plus générale, est une autre fonction : isset($var) . Cette fonction retourne true si la variable passée en paramètre existe, false sinon. Exemple :

<?php

var_dump(isset($hu)); // false
$tab = array('lili');
var_dump(isset($tab)); // true
var_dump(isset($tab[0])); // true, la clé existe
var_dump(isset($tab['euh…'])); // false, la clé n'existe pas

INFORMATION : On peut tester l'existence de plusieurs variables en n'utilisant qu'une seule fois la fonction isset(), on les séparera alors par une virgule : isset($a, $b, $c). La fonction retournera false si au moins une des variables n'existe pas (n'est pas définie).

Quelle est ta clé ?

On peut très facilement obtenir la valeur associée à une clé, il nous suffit de taper $array[cle]. Mais l'inverse, trouver une clé associée à une valeur, peut aussi être intéressant. La fonction array_search($value, $array) retourne la clé associée à la valeur $value ou false si la valeur n'existe pas dans l'array.

Code PHP :

<?php

$tab = array('lili', 'lala');
var_dump(array_search('lili', $tab));
var_dump(array_search('yo', $tab));

Dis-moi tout…

De temps à autre, pour déboguer un script par exemple, vous aurez besoin d'afficher d'un coup toutes les clés et toutes les valeurs associées d'un array. On pourrait le faire avec un foreach, mais pourquoi s'embêter quand une fonction existe ?

Code PHP :

<?php

$yo = array(
'meuh' => 'Oh yeah',
true => true,
6 => 5.67
);

echo '<pre>';
print_r($yo);
echo '</pre>';

Ça rend plutôt bien, n'est-ce pas ? N'oubliez pas de mette une balise <pre> avant de faire le print_r(), ça permettra d'avoir un joli texte bien organisé (essayez sans si vous doutez de ça  ).

Je veux des arrays !

Il peut arriver que vous ayez besoin de créer des arrays bien particuliers, par exemple un array qui contient les lettres de a à e, de a à z, des chiffres de 0 à 9, de 1 à 234, etc.
Au lieu de faire des boucles ou de taper des dizaines de lignes, on va utiliser la fonction range($start, $end). Exemple :

Code PHP :

<?php

$str = '17/08/2007';
echo '<pre>';
print_r(explode('/', $str));

Vous l'aurez compris, on coupe la chaîne avec le séparateur (ici '/') et on colle le tout dans un array.

Collage

Vous savez découper une chaîne pour en faire un array, mais ça peut être utile de faire l'inverse : créer une chaîne de caractères à partir d'un array. Pour cela, il y a implode().

Code PHP :

<?php

$array = array(17, 8, 2007);
echo implode('/', $array);

Encore une fois, on utilise un séparateur, mais cette fois-ci il sert de « colle ».

Bon, il existe beaucoup d'autres fonctions, je ne vais pas tout montrer ici. Il vous suffit d'aller voir sur le lien que j'ai donné un peu plus haut pour voir la liste des fonctions (descendez jusqu'à la table des matières pour avoir le nom et le rôle de toutes les fonctions).

Derniers mots et structure de contrôle

Il existe une autre fonction très utile : count(). Exemple :

Code PHP :

<?php

$a = array(0, 9, 8, 'r');
echo count($a);

Vous l'aurez compris, cette fonction compte le nombre d'associations qu'il y a dans l'array et vous renvoie ce nombre (la fonction sizeof() fait exactement la même chose, seul le nom change).
Ça pourra vous servir si vous voulez obtenir la dernière clé d'un array sans devoir le parcourir entièrement.

Mais pourquoi je dis ça ici ?… Pour introduire la dernière structure de boucle qu'offre le PHP, la quatrième, for(). Cette boucle est un peu plus complexe que les trois autres, mais ne craignez rien.
Voici cette structure réduite à sa plus simple expression :

Code PHP :

<?php

for(Expression_une; Expression_deux; Expression_trois)
{
// bloc d'instructions
}

Vous l'avez sans doute compris, la difficulté réside dans la ligne où se trouve le for(). Vous voyez qu'entre les parenthèses, il y a trois expressions différentes séparées par des points-virgules.

L'expression une est l'expression d'initialisation, elle n'est exécutée qu'une seule et unique fois, au tout début de la boucle.
L'expression deux est l'expression de condition ; tant qu'elle vaudra true, la boucle continuera (comme pour while et do while). Cette expression est exécutée à chaque tour de boucle.
L'expression trois est l'expression itérative, elle est également exécutée à chaque tour de boucle et vous permet de faire certaines actions. Ceci est illustré à la figure 10.1.

Vous pouvez ne rien mettre dans ces expressions ; ainsi, cette syntaxe est correcte :

Code PHP :

<?php

for(;;)
{
echo 'bonjour';
}

Les expressions qui ne sont pas renseignées sont évaluées à true et donc, vous l'aurez compris, je viens de vous donner le code pour faire une boucle infinie. Il peut arriver qu'on ait besoin de générer ce genre de boucle, mais c'est rare.

Généralement, cette structure de contrôle est utilisée pour faire un nombre donné d'itérations. Par exemple, si je veux afficher les dix premiers chiffres :

Code PHP :

<?php

for($i = 0; $i < 10; $i++)
{
echo $i . ' ';
}

On veut afficher les dix premiers nombres pairs ?

<?php

for($i = 0; $i <= 20; $i += 2)
{
echo $i . ' ';
}

Il peut arriver qu'on ait besoin de plusieurs instructions dans l'une ou l'autre expression du for ; on peut le faire, mais on les séparera par une virgule et non par un point-virgule.

<?php

for($i = 0, $j = 20; $i < $j; $i++)
{
echo $i . ' ';
}

Mais quel rapport avec les arrays ?

J'y viens !

Souvent, on voit des codeurs parcourir des arrays avec for et count() (alors que foreach est fait pour ça !). Il y a encore pire : ils mettent le count() dans l'expression deux du for.

Mais où est le problème ?

Celui qui se pose cette question peut aller relire l'explication sur le for. En effet, les instructions deux et trois du for sont ré-exécutées à chaque tour de boucle. Vous allez donc compter le nombre d'éléments du tableau autant de fois qu'il y a d'éléments dans le tableau . Vous allez utiliser inutilement la fonction count() un grand nombre de fois et vous perdrez en performance.

Voici ce qu'il ne faut surtout pas faire :

Code PHP :

<?php

$tab = range('a', 'z');
for($i = 0; $i < count($tab); $i++)
{
echo $tab[$i];
}

La fonction count() sera appelée vingt-six fois au lieu d'une… Ça vous amuserait, vous, de faire vingt-cinq fois le même calcul ? Vous perdriez votre temps.
Par contre, ceci est beaucoup mieux :

<?php

$tab = range('a', 'z');
for($i = 0, $count = count($tab); $i < $count; $i++)
{
echo $tab[$i];
}

Comme le count() est dans la première expression, il n'est exécuté qu'une et une seule fois.
Mais le mieux est bien évidemment foreach qui est fait pour ça :

<?php

foreach(range('a', 'z') as $lettre)
{
echo $lettre;
}

Les faux jumeaux

Vous croyiez que j'en avais fini avec vous ?
Quelle désillusion, je dois encore vous parler de l'histoire des faux jumeaux.

Les faux jumeaux, ce sont les chaînes de caractères et les arrays. Mais pourquoi ?
Parce qu'une chaîne de caractères, c'est un array de caractères ! Exemple :

Code PHP :

<?php

$str = 'bonjour';
for($i = 0, $lim = strlen($str); $i < $lim; $i++)
{
echo $str[$i];
}

Vous reconnaissez les crochets, symptomatiques des arrays. Toutefois, si les chaînes de caractères ressemblent aux arrays, elles n'en sont pas.
Vous vous souvenez de ce que j'ai dit ? Que pour parcourir un array, le must était d'utiliser un foreach. Pourquoi ne l'ai-je pas fait, à votre avis ?
Tout simplement parce que si j'avais fait un foreach sur ma chaîne de caractères, j'aurais eu une erreur de ce style :

Code console :

Warning: Invalid argument supplied for foreach() in C:\www\test.php on line 42

Cette erreur survient quand vous donnez un type qui n'est pas attendu à une fonction ou à une structure (par exemple si une fonction demande un entier et que je lui donne un array, vous aurez une erreur de ce style).

Les chaînes de caractères ne sont pas des arrays.

La seule similitude entre ces deux types, c'est qu'on peut accéder à chacun des éléments en utilisant la syntaxe des crochets. Les clés dans une chaîne de caractères vont de 0 à n-1 avec n le nombre de caractères, tout comme les arrays.
Si vous voulez obtenir un véritable array à partir d'une chaîne de caractères, vous pouvez utiliser la fonction str_split().

Il est possible que vous voyiez cette syntaxe :

Code PHP :

<?php

$str = 'bonjour';
echo $str{0}; // affiche 'b'

Utiliser des accolades est strictement équivalent à utiliser des crochets. Seulement, la syntaxe avec les accolades sera tout simplement supprimée dans les prochaines versions de PHP. Donc si vous ne voulez pas avoir à modifier vos scripts plus tard, prenez la bonne habitude et utilisez les crochets ([]).

Courage courage, bientôt les bases seront finies, bientôt les visiteurs pourront interagir avec vos scripts. Mais avant tout ça, faisons une petite pause avec un chapitre plus relax après ce looong chapitre.

 

Infos Plan Partenaires
À propos Webmasters
C.G.U Services Gratuits Annuaire de sites web
Bannières Forum Ionoa

 

Aipoweb est un site édité par ASMOH NetWork  ©

Créer un site gratuit avec e-monsite - Signaler un contenu illicite sur ce site