Les tableaux

Un tableau en PHP est en fait une carte ordonn�e. Une carte est un type qui associe des valeurs en cl�s. Ce type est optimis� pour diff�rentes utilisations ; il peut �tre consid�r� comme un tableau, une liste, une table de hashage, un dictionnaire, une collection, une pile, une file d'attente et probablement plus. On peut avoir, comme valeur d'un tableau, d'autres tableaux, multidimensionnels ou non.

La structure de ces donn�es d�passe l'objet de ce manuel, mais vous trouverez au moins un exemple pour chacun des cas �voqu�s. Pour plus d'informations, reportez-vous aux diff�rentes explications sur le sujet que l'on trouve sur le web.

Syntaxe

Syntaxe d'un tableau

Un tableau peut �tre cr�� avec le constructeur de langage array(). Il prend un nombre illimit� de param�tres, chacun s�par� par une virgule, sous la forme d'une paire cl� => valeur.

array(  cl� =>  valeur
     , ...
     )
// cl� ne peut �tre qu'un entier ou une cha�ne de caract�res
// valeur peut �tre de n'importe quel type
<?php
$arr 
= array("foo" => "bar"12 => true);

echo 
$arr["foo"]; // bar
echo $arr[12];    // 1
?>

Une cl� peut �tre soit un entier, soit une cha�ne de caract�res. Si une cl� est une repr�sentation standard d'un entier, elle sera interpr�t�e comme telle (i.e. "8" sera interpr�t� comme 8, alors que "08" sera interpr�t�e comme "08"). Les nombres � virgule flottante, en tant que cl�, seront tronqu�s en entier. Les tableaux index�s ou associatifs, en PHP, sont du m�me type ; ils peuvent ainsi contenir des indices sous la forme d'entier et de cha�ne de caract�res.

Une valeur peut �tre de n'importe quel type PHP.

<?php
$arr 
= array("somearray" => array(=> 513 => 9"a" => 42));

echo 
$arr["somearray"][6];    // 5
echo $arr["somearray"][13];   // 9
echo $arr["somearray"]["a"];  // 42
?>

Si une cl� n'est pas sp�cifi�e pour une valeur, l'indice entier maximal sera pris et la nouvelle cl� sera cette valeur, plus 1. Si une cl� contient d�j� une valeur associ�e, cette valeur sera �cras�e.

<?php
// Ce tableau est identique � ...
array(=> 433256"b" => 12);

// ...ce tableau
array(=> 43=> 32=> 56"b" => 12);
?>
Avertissement

Avant PHP 4.3.0, le fait d'ajouter � un tableau une valeur, dont la pr�c�dent cl� est n�gative, reproduisait le comportement ci-dessus. Depuis PHP 4.3.0, la nouvelle cl� sera 0.

Utiliser TRUE comme cl� sera �valu� � l'entier 1. Utiliser FALSE comme cl� sera �valu� � l'entier 0. Utiliser NULL comme cl� sera �valu� � une cha�ne de caract�res vide. Utiliser une cha�ne de caract�res vide comme cl� cr�era une cl� (ou l'�crasera) vide et sa valeur ne sera pas la m�me si on utilise des parenth�ses vides.

Les tableaux et les objets ne peuvent �tre utilis�s comme cl�s. Si vous tentez de le faire, une message de type Alerte sera �mis : Illegal offset type.

Cr�ation/modification avec des crochets

Un tableau existant peut �tre modifi� en y assignant explicitement des valeurs.

L'assignation d'une valeur dans un tableau est effectu� en sp�cifiant la cl�, entre crochets. La cl� peut �galement ne pas �tre renseign�e, sous la forme : [].

$arr[cl�] = valeur;
$arr[] = valeur;
// cl� peut �tre un entier ou une cha�ne de caract�res
// valeur peut �tre n'importe quel type

Si $arr n'existe pas lors de l'assignation, il sera cr�� ; c'est ainsi une fa�on d�tourn�e de cr�er un tableau. Pour modifier une valeur en particulier, il convient d'assigner une valeur en sp�cifiant sa cl�. Pour effacer une paire cl�/valeur, il convient d'appeler la fonction unset() sur la cl� d�sir�e.

<?php
$arr 
= array(=> 112 => 2);

$arr[] = 56;    // Identique � $arr[13] = 56;
                // � cet endroit du script

$arr["x"] = 42// Ceci ajoute un nouvel �l�ment au
                // tableau avec la cl� "x"

unset($arr[5]); // Ceci efface l'�l�ment du tableau

unset($arr);    // Ceci efface compl�tement le tableau
?>

Note: Comme dit plus haut, si aucune cl� n'est sp�cifi�e, l'indice maximal existant est repris, et la nouvelle cl� sera ce nombre, plus 1. Si aucun indice entier n'existe, la cl� sera 0 (z�ro).
Notez que la cl� enti�re maximale pour cette op�ration n'a pas besoin d'exister dans le tableau au moment de la manipulation. Elle doit seulement avoir exist� dans le tableau � un moment ou un autre depuis la derni�re fois o� le tableau a �t� r�-index�. Voici un exemple qui illustre ce principe :

<?php
// Cr�ation d'un tableau simple.
$array = array(12345);
print_r($array);

// Maintennant, on efface tous les �l�ments, mais on concerne le tableau :
foreach ($array as $i => $value) {
    unset(
$array[$i]);
}
print_r($array);

// Ajout d'un �l�ment (notez que la nouvelle cl� est 5, et non 0).
$array[] = 6;
print_r($array);

// R�-indexation :
$array array_values($array);
$array[] = 7;
print_r($array);
?>

L'exemple ci-dessus va afficher :

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)
Array
(
)
Array
(
    [5] => 6
)
Array
(
    [0] => 6
    [1] => 7
)

Fonctions utiles

Il y a beaucoup de fonctions utiles pour travailler avec les tableaux. Nous vous invitons � lire la section de ce manuel sur les fonctions en rapport avec les tableaux.

Note: La fonction unset() permet d'effacer les cl�s d'un tableau. Soyez attentif sur le fait que le tableau ne sera pas r�-index�. Si vous voulez r�aliser un effacement complet et une r�-indexation de votre tableau, vous devez utiliser la fonction array_values().

<?php
$a 
= array(=> 'one'=> 'two'=> 'three');
unset(
$a[2]);
/* produira un tableau comme ceci
   $a = array(1 => 'one', 3 => 'three');
   et NON un tableau comme ceci
   $a = array(1 => 'one', 2 =>'three');
*/

$b array_values($a);
// Maintenant, $b vaut array(0 => 'one', 1 =>'three')
?>

La structure de contr�le foreach existe tout sp�cialement pour les tableaux. Elle fournit une mani�re pratique de parcourir un tableau.

Ce qu'il est possible de faire ou non avec un tableau

Pourquoi $foo[bar] est incorrect ?

Utiliser toujours des guillemets autour d'un index litt�ral. Par exemple, $foo['bar'] est correct, alors que $foo[bar] ne l'est pas. Mais pourquoi ? il est courant de rencontrer ce genre de syntaxe dans d'ancien script :

<?php
$foo
[bar] = 'enemy';
echo 
$foo[bar];
// etc
?>

C'est incorrect, mais �a fonctionne. La raison est que ce code a une constante ind�finie (bar) plut�t qu'une cha�ne ('bar' - noter les guillemets). PHP peut d�finir plus loin une constante portant le m�me nom. Cela fonctionne car PHP convertit automatiquement une cha�ne nue (une cha�ne sans guillemets qui ne correspond � aucun symbole connu) en une cha�ne qui la contient. Actuellement, s'il n'y a aucune constante nomm�e bar, alors PHP substituera 'bar' dans la cha�ne et l'utilisera.

Note: Ceci ne signifie pas qu'il faut toujours mettre la cl� entre guillemets. N'utilisez pas de guillemets avec les cl�s qui sont des constantes ou des variables, car cela emp�cherait PHP de les interpr�ter.

<?php
error_reporting
(E_ALL);
ini_set('display_errors'true);
ini_set('html_errors'false);
// Tableau simple :
$array = array(12);
$count count($array);
for (
$i 0$i $count$i++) {
    echo 
"\nV�rification de $i : \n";
    echo 
"Mauvais : " $array['$i'] . "\n";
    echo 
"Bon : " $array[$i] . "\n";
    echo 
"Mauvais : {$array['$i']}\n";
    echo 
"Bon : {$array[$i]}\n";
}
?>

L'exemple ci-dessus va afficher :

V�rification de 0 :
Notice: Undefined index:  $i in /path/to/script.php on line 9
Mauvais :
Bon : 1
Notice: Undefined index:  $i in /path/to/script.php on line 11
Mauvais :
Bon : 1

V�rification de 1 :
Notice: Undefined index:  $i in /path/to/script.php on line 9
Mauvais :
Bon : 2
Notice: Undefined index:  $i in /path/to/script.php on line 11
Mauvais :
Bon : 2

Plus d'exemples pour expliquer ce comportement :

<?php
// Affichons toutes les erreurs
error_reporting(E_ALL);

$arr = array('fruit' => 'apple''veggie' => 'carrot');

// Correct
print $arr['fruit'];  // apple
print $arr['veggie']; // carrot

// Incorrect.  Ceci fonctionne mais PHP �mettera une erreur de type E_NOTICE car
// on utilise la constante nomm�e fruit qui est ind�finie
// 
// Notice: Use of undefined constant fruit - assumed 'fruit' in...
print $arr[fruit];    // apple

// Ceci d�finit une constante pour expliquer ce qu'il ne va pas. La valeur 'veggie'
// est assign�e � la constante nomm�e fruit.
define('fruit''veggie');

// Noter la diff�rence maintenant
print $arr['fruit'];  // apple
print $arr[fruit];    // carrot

// Ce qui squit est correct, car c'est dans une cha�ne. Les constantes ne sont pas recherch�es
// dans les cha�nes, et donc, aucune alerte E_NOTICE ne sera �mise
print "Hello $arr[fruit]";      // Hello apple

// Avec une exception : les parenth�ses autour d'un tableau dans une cha�ne permettent
// aux constantes d'�tre interpr�t�es
print "Hello {$arr[fruit]}";    // Hello carrot
print "Hello {$arr['fruit']}";  // Hello apple

// Ceci ne fonctionnera pas, et en r�sultera une erreur d'analyse, comme ceci :
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// Ceci arrive lors de l'utilisation d'une supergloables dans les cha�nes
print "Hello $arr['fruit']";
print 
"Hello $_GET['foo']";

// La concat�nation est une autre solution
print "Hello " $arr['fruit']; // Hello apple
?>

Lorsque error_reporting est d�fini afin de montrer les erreurs de type E_NOTICE (en le d�finissant � E_ALL, par exemple), une telle pratique devient imm�diatement visible. Par d�faut, error_reporting n'est pas d�fini pour afficher toutes les alertes.

Comme vu dans la section "syntaxe", ce qui se trouve entre crochets ('[' et ']') doit �tre une expression. Ceci signifie que le code ci-dessous fonctionne :

<?php
echo $arr[somefunc($bar)];
?>

C'est un exemple d'utilisation d'une fonction retournant une valeur qui sera la cl� du tableau. PHP comprend �galement les constantes :

<?php
$error_descriptions
[E_ERROR]   = "A fatal error has occured";
$error_descriptions[E_WARNING] = "PHP issued a warning";
$error_descriptions[E_NOTICE]  = "This is just an informal notice";
?>

Noter que E_ERROR est �galement un identifiant valide, tout comme bar dans le premier exemple. Mais le dernier exemple est finalement le m�me que celui-ci :

<?php
$error_descriptions
[1] = "A fatal error has occured";
$error_descriptions[2] = "PHP issued a warning";
$error_descriptions[8] = "This is just an informal notice";
?>

car E_ERROR vaut 1, etc.

Alors, pourquoi est-ce une mauvaise pratique ?

Dans le futur, les d�veloppeurs PHP peuvent vouloir ajouter une autre constante ou un autre mot cl�, ou bien une constante dans une autre partie du code qui peut interf�rer. Par exemple, il est toujours incorrect d'utiliser le mot empty et default, sachant que ce sont des mots r�serv�s.

Note: Pour �tre plus clair, dans une cha�ne entour�e de guillemets doubles, il est valide de ne pas entourer les indexes d'un tableau avec des guillemets, et donc, "$foo[bar]" est valide. Voir les exemples ci-dessous pour plus d�tails mais aussi la section sur l'analyse des variables dans les cha�nes.

Conversion en un tableau

Pour tous les types : entier, nombre d�cimal, cha�ne de caract�res, bool�en et ressource, le fait de convertir une valeur en un tableau r�sulte en un tableau contenant un seul �l�ment dont l'indexe vaut z�ro et la valeur, une valeur scalaire convertie. En d'autres termes, (array)$scalarValue est exactement la m�me chose que array($scalarValue).

Si un objet est converti en un tableau, le r�sultat sera un tableau dont les �l�ments sont les propri�t�s de l'objet. Les cl�s sont les noms des membres, avec une l�g�re exception : les variables ayant un nom sous forme d'entier sont inaccessible; les variables priv�es auront le nom de la classe ajout� au nom de la variable ; les variables prot�g�es auront un '*' ajout� au nom de la variable. Ce comportement peut amener � des r�sultats inattendus :

<?php

class {
    private 
$A// Ceci devient '\0A\0A'
}

class 
extends {
    private 
$A// Ceci devient '\0B\0A'
    
public $AA// Ceci devient 'AA'
}

var_dump((array) new B());
?>

Ici, on pourrait penser qu'il y a 2 cl�s nomm�es 'AA', alors qu'une est actuellement nomm�e '\0A\0A'.

La conversion de NULL en un tableau r�sultat en un tableau vide.

Comparaison

Il est possible de comparer plusieurs tableaux avec la fonction array_diff() ainsi qu'avec les op�rateurs de tableaux.

Exemples

Le type tableau en PHP est vraiment versatile. Voici quelques exemples :

<?php
// This
$a = array( 'color' => 'red',
            
'taste' => 'sweet',
            
'shape' => 'round',
            
'name'  => 'apple',
             
4        // la cl� sera 0
          
);

// est strictement �quivalent �
$a = array();
$a['color'] = 'red';
$a['taste'] = 'sweet';
$a['shape'] = 'round';
$a['name']  = 'apple';
$a[]        = 4;        // la cl� sera 0

$b[] = 'a';
$b[] = 'b';
$b[] = 'c';

// Apr�s ex�cution du code ci-dessus, $a sera le tableau
// array('color' => 'red', 'taste' => 'sweet', 'shape' => 'round', 
// 'name' => 'apple', 0 => 4), et $b sera le tableau
// array(0 => 'a', 1 => 'b', 2 => 'c'), ou simplement array('a', 'b', 'c').
?>

Exemple #1 Utilisation de array()

<?php
// Tableau comme carte de propri�t�s
$map = array( 'version'    => 4,
              
'OS'         => 'Linux',
              
'lang'       => 'english',
              
'short_tags' => true
            
);

// cl�s num�riques strictes
$array = array( 7,
                
8,
                
0,
                
156,
                -
10
              
);
// est identique � array(0 => 7, 1 => 8, ...)

$switching = array(         10// cl� = 0
                    
5    =>  6,
                    
3    =>  7
                    
'a'  =>  4,
                            
11// cl� = 6 (l'indice entier maximal est 5)
                    
'8'  =>  2// cl� = 8 (intier !)
                    
'02' => 77// cl� = '02'
                    
0    => 12  // la valeur 10 sera �cras�e par la valeur 12
                  
);

// empty array
$empty = array();
?>

Exemple #2 Collection

<?php
$colors 
= array('rouge''bleu''verte''jaune');

foreach (
$colors as $color) {
    echo 
"Aimez-vous la couleur $color ?\n";
}

?>

L'exemple ci-dessus va afficher :

Aimez-vous la couleur rouge ?
Aimez-vous la couleur bleu ?
Aimez-vous la couleur verte ?
Aimez-vous la couleur jaune ?

La modification directe de valeurs d'un tableau est possible depuis PHP 5 en le passant par r�f�rence. Avant cette version, nous devions utiliser l'astuce suivante :

Exemple #3 Collection

<?php
// PHP 5
foreach ($colors as &$color) {
    
$color strtoupper($color);
}
unset(
$color); /* On s'assure que les �critures suivantes
sur $color ne modifie pas le dernier �l�ment du tableau */

// Astuce pour les anciennes versions
foreach ($colors as $key => $color) {
    
$colors[$key] = strtoupper($color);
}

print_r($colors);
?>

L'exemple ci-dessus va afficher :

Array
(
    [0] => ROUGE
    [1] => BLEU
    [2] => VERTE
    [3] => JAUNE
)

Cet exemple cr�e un tableau, dont l'indexation commence � 1.

Exemple #4 Indexation commen�ant � 1

<?php
$firstquarter  
= array(=> 'Janvier''F�vrier''Mars');
print_r($firstquarter);
?>

L'exemple ci-dessus va afficher :

Array 
(
    [1] => 'Janvier'
    [2] => 'F�vrier'
    [3] => 'Mars'
)

Exemple #5 Remplissage d'un tableau

<?php
// Remplit un tableau avec tous les �l�ments d'un dossier
$handle opendir('.');
while (
false !== ($file readdir($handle))) {
    
$files[] = $file;
}
closedir($handle); 
?>

Les tableaux sont ordonn�s. L'ordre peut �tre modifi� en utilisant plusieurs fonctions. Voir la section sur les fonctions sur les tableaux pour plus d'informations. La fonction count() peut �tre utilis�e pour compter le nombre d'�l�ments d'un tableau.

Exemple #6 Trie d'un tableau

<?php
sort
($files);
print_r($files);
?>

Sachant que la valeur d'une tableau peut �tre n'importe quoi, elle peut aussi �tre un autre tableau. Ceci permet la cr�ation de tableaux r�cursifs et de tableaux multidimensionnels.

Exemple #7 Tableaux r�cursifs et multidimensionnels

<?php
$fruits 
= array ( "fruits"  => array ( "a" => "orange",
                                       
"b" => "banana",
                                       
"c" => "apple"
                                     
),
                  
"numbers" => array ( 1,
                                       
2,
                                       
3,
                                       
4,
                                       
5,
                                       
6
                                     
),
                  
"holes"   => array (      "first",
                                       
=> "second",
                                            
"third"
                                     
)
                );

// Quelques exemples pour retrouver les valeurs dans le tableau ci-dessus 
echo $fruits["holes"][5];    // affiche "second"
echo $fruits["fruits"]["a"]; // affiche "orange"
unset($fruits["holes"][0]);  // efface "first"

// Cr�ation d'un tableau multidimensionnel
$juices["apple"]["green"] = "good"
?>

L'assignation d'un tableau induit toujours la copie des valeurs. Utilisez l'op�rateur de r�f�rence pour copier un tableau par r�f�rence.

<?php
$arr1 
= array(23);
$arr2 $arr1;
$arr2[] = 4// $arr2 est modifi�,
             // $arr1 vaut toujours array(2, 3)

$arr3 = &$arr1;
$arr3[] = 4// maintenant, $arr1 et $arr3 sont identiques
?>