Files
doc-fr/language/control-structures/foreach.xml
2021-04-15 22:36:22 +01:00

316 lines
7.2 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: e49940b757b35b8ef26bb64380c231eda7b49fc4 Maintainer: jpauli Status: ready -->
<!-- Reviewed: yes -->
<sect1 xml:id="control-structures.foreach" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>foreach</title>
<?phpdoc print-version-for="foreach"?>
<para>
La structure de langage <literal>foreach</literal> fournit une façon simple de
parcourir des tableaux. <literal>foreach</literal> ne fonctionne que pour les tableaux
et les objets, et émettra une erreur si vous tentez de l'utiliser sur une
variable de type différent ou une variable non initialisée. Il existe
deux syntaxes :
<informalexample>
<programlisting>
<![CDATA[
foreach (iterable_expression as $value){
//commandes
}
foreach (iterable_expression as $key => $value){
//commandes
}
]]>
</programlisting>
</informalexample>
</para>
<simpara>
La première forme passe en revue le tableau
<literal>iterable_expression</literal>. À chaque itération, la valeur de
l'élément courant est assignée à <literal>$value</literal>.
</simpara>
<simpara>
La seconde forme assignera en plus la clé de l'élément courant
à la variable <literal>$key</literal> à chaque itération.
</simpara>
<simpara>
Il est à noter que <literal>foreach</literal> ne modifie pas le pointeur
interne du tableau, qui est utilisé par les fonctions tel que
<function>current</function> et <function>key</function>.
</simpara>
<simpara>
Il est possible de personnaliser
<link linkend="language.oop5.iterations">l'itération sur des objets</link>.
</simpara>
<para>
Vous pouvez modifier facilement les éléments d'un tableau en
précédent <literal>$value</literal> d'un &amp;. Ceci assignera une
<link linkend="language.references">référence</link> au lieu de copier la
valeur.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr vaut maintenant array(2, 4, 6, 8)
unset($value); // Détruit la référence sur le dernier élément
?>
]]>
</programlisting>
</informalexample>
</para>
<warning>
<para>
La référence de <literal>$value</literal> et le dernier élément du tableau
sont conservés après l'exécution de la boucle <literal>foreach</literal>.
Il est recommandé de les détruire en utilisant la fonction
<function>unset</function>. Sinon, vous ressentirez le
comportement suivant :
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr est maintenant array(2, 4, 6, 8)
// sans un unset($value), $value est toujours une référence au dernier élément: $arr[3]
foreach ($arr as $key => $value) {
// $arr[3] sera mis à jour avec chaque valeur de $arr...
echo "{$key} => {$value} ";
print_r($arr);
}
// ...jusqu'à ce que finalement la valeur de deuxième à dernière soit copiée sur la dernière valeur
// sortie :
// 0 => 2 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 2 )
// 1 => 4 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 4 )
// 2 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
// 3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
?>
]]>
</programlisting>
</informalexample>
</warning>
<para>
Il est possible d'itérer la valeur d'un tableau constant par référence :
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
foreach (array(1, 2, 3, 4) as &$value) {
$value = $value * 2;
}
?>
]]>
</programlisting>
</informalexample>
</para>
<para>
<note>
<para>
<literal>foreach</literal> ne supporte pas la suppression des messages
d'erreur utilisant
<literal linkend="language.operators.errorcontrol">@</literal>.
</para>
</note>
</para>
<para>
Voici quelques exemples de plus :
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
/* exemple foreach 1 : la valeur seulement */
$a = array(1, 2, 3, 17);
foreach ($a as $v) {
echo "Valeur courante de \$a: $v.\n";
}
/* exemple foreach 2 : la valeur et sa clé d'index */
$a = array(1, 2, 3, 17);
$i = 0; /* uniquement pour l'illustration */
foreach ($a as $v) {
echo "\$a[$i] => $v.\n";
$i++;
}
/* exemple foreach 3 : la clé et la valeur */
$a = array(
"un" => 1,
"deux" => 2,
"trois" => 3,
"dix-sept" => 17
);
foreach ($a as $k => $v) {
echo "\$a[$k] => $v.\n";
}
/* exemple foreach 4 : tableaux multidimensionnels */
$a = array();
$a[0][0] = "a";
$a[0][1] = "b";
$a[1][0] = "y";
$a[1][1] = "z";
foreach ($a as $v1) {
foreach ($v1 as $v2) {
echo "$v2\n";
}
}
/* exemple foreach 5 : tableaux dynamiques */
foreach (array(1, 2, 3, 4, 5) as $v) {
echo "$v\n";
}
?>
]]>
</programlisting>
</informalexample>
</para>
<sect2 xml:id="control-structures.foreach.list">
<title>Extraction des tableaux internes avec list()</title>
<?phpdoc print-version-for="foreach.list"?>
<para>
Il est possible d'itérer dans un tableau de tableaux,
et d'en extraire les tableaux internes dans des variables, en fournissant
une liste <function>list</function> comme valeur.
</para>
<para>
Par exemple :
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as list($a, $b)) {
// $a contient le premier élément du tableau interne,
// et $b contient le second élément.
echo "A: $a; B: $b\n";
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
A: 1; B: 2
A: 3; B: 4
]]>
</screen>
</informalexample>
</para>
<para>
Vous pouvez fournir moins d'éléments dans la fonction
<function>list</function> qu'il n'y en a dans le tableau interne,
auquel cas, les valeurs du tableau les plus à droite seront ignorées :
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as list($a)) {
// Notez qu'il n'y a pas de $b ici.
echo "$a\n";
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
1
3
]]>
</screen>
</informalexample>
</para>
<para>
Une notification sera générée s'il n'y a pas assez d'éléments dans le tableau
pour remplir la fonction <function>list</function> :
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as list($a, $b, $c)) {
echo "A: $a; B: $b; C: $c\n";
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Notice: Undefined offset: 2 in example.php on line 7
A: 1; B: 2; C:
Notice: Undefined offset: 2 in example.php on line 7
A: 3; B: 4; C:
]]>
</screen>
</informalexample>
</para>
</sect2>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->