Recherche…


Syntaxe

  • pour ($ i = 0; $ i <count ($ array); $ i ++) {incremental_iteration (); }
  • for ($ i = count ($ array) - 1; $ i> = 0; $ i--) {reverse_iteration (); }
  • foreach ($ data en $ datum) {}
  • foreach ($ data en tant que $ key => $ datum) {}
  • foreach ($ data as & $ datum) {}

Remarques

Comparaison de méthodes pour itérer un tableau

Méthode Avantage
foreach La méthode la plus simple pour itérer un tableau.
foreach par référence Méthode simple pour itérer et modifier les éléments d'un tableau.
for avec index incrémental Permet d'itérer le tableau dans une séquence libre, par exemple en sautant ou en inversant plusieurs éléments
Pointeurs de tableau internes Il n'est plus nécessaire d'utiliser une boucle (pour pouvoir itérer une fois chaque appel de fonction, signal reçu, etc.)

Itérer plusieurs tableaux ensemble

Parfois, deux tableaux de même longueur doivent être itérés ensemble, par exemple:

$people = ['Tim', 'Tony', 'Turanga'];
$foods = ['chicken', 'beef', 'slurm'];

array_map est le moyen le plus simple d'y parvenir:

array_map(function($person, $food) {
    return "$person likes $food\n";
}, $people, $foods);

qui produira:

Tim likes chicken
Tony likes beef
Turanga likes slurm

Cela peut être fait via un index commun:

assert(count($people) === count($foods));
for ($i = 0; $i < count($people); $i++) {
    echo "$people[$i] likes $foods[$i]\n";
}

Si les deux tableaux n'ont pas les clés incrémentielles, array_values($array)[$i] peut être utilisé pour remplacer $array[$i] .

Si les deux tableaux ont le même ordre de clés, vous pouvez également utiliser une boucle foreach-with-key sur l'un des tableaux:

foreach ($people as $index => $person) {
    $food = $foods[$index];
    echo "$person likes $food\n";
}

Les tableaux séparés ne peuvent être mis en boucle que s'ils ont la même longueur et ont le même nom de clé. Cela signifie que si vous ne fournissez pas de clé et que celles-ci sont numérotées, tout ira bien ou si vous nommez les clés et les mettez dans le même ordre dans chaque tableau.

Vous pouvez également utiliser array_combine .

$combinedArray = array_combine($people, $foods);
// $combinedArray = ['Tim' => 'chicken', 'Tony' => 'beef', 'Turanga' => 'slurm'];

Ensuite, vous pouvez parcourir ceci en procédant comme avant:

foreach ($combinedArray as $person => $meal) {
    echo "$person likes $meal\n";
}

Utilisation d'un index incrémentiel

Cette méthode fonctionne en incrémentant un entier de 0 au plus grand index du tableau.

$colors = ['red', 'yellow', 'blue', 'green'];
for ($i = 0; $i < count($colors); $i++) {
    echo 'I am the color ' . $colors[$i] . '<br>';
}

Cela permet également d'itérer un tableau dans l'ordre inverse sans utiliser array_reverse , ce qui peut entraîner une surcharge si le tableau est volumineux.

$colors = ['red', 'yellow', 'blue', 'green'];
for ($i = count($colors) - 1; $i >= 0; $i--) {
    echo 'I am the color ' . $colors[$i] . '<br>';
}

Vous pouvez ignorer ou rembobiner l'index facilement en utilisant cette méthode.

$array = ["alpha", "beta", "gamma", "delta", "epsilon"];
for ($i = 0; $i < count($array); $i++) {
    echo $array[$i], PHP_EOL;
    if ($array[$i] === "gamma") {
        $array[$i] = "zeta";
        $i -= 2;
    } elseif ($array[$i] === "zeta") {
        $i++;
    }
}

Sortie:

alpha
beta
gamma
beta
zeta
epsilon

Pour les tableaux sans index incrémentiel (y compris les tableaux avec des index dans l'ordre inverse, par exemple [1 => "foo", 0 => "bar"] , ["foo" => "f", "bar" => "b"] ), cela ne peut pas être fait directement. array_values ou array_keys peuvent être utilisés à la place:

$array = ["a" => "alpha", "b" => "beta", "c" => "gamma", "d" => "delta"];
$keys = array_keys($array);
for ($i = 0; $i < count($array); $i++) {
    $key = $keys[$i];
    $value = $array[$key];
    echo "$value is $key\n";
}

Utilisation de pointeurs de tableau internes

Chaque instance de tableau contient un pointeur interne. En manipulant ce pointeur, différents éléments d’un tableau peuvent être extraits du même appel à des moments différents.

En utilisant each

Chaque appel à each() renvoie la clé et la valeur de l'élément de tableau en cours et incrémente le pointeur de tableau interne.

$array = ["f" => "foo", "b" => "bar"];
while (list($key, $value) = each($array)) {
    echo "$value begins with $key";
}

Utiliser next

$array = ["Alpha", "Beta", "Gamma", "Delta"];
while (($value = next($array)) !== false) {
    echo "$value\n";
}

Notez que cet exemple suppose qu'aucun élément du tableau n'est identique à booléen false . Pour éviter une telle hypothèse, utilisez la key pour vérifier si le pointeur interne a atteint la fin du tableau:

$array = ["Alpha", "Beta", "Gamma", "Delta"];
while (key($array) !== null) {
    echo current($array) . PHP_EOL;
    next($array);
}

Cela facilite également l'itération d'un tableau sans boucle directe:

class ColorPicker {
    private $colors = ["#FF0064", "#0064FF", "#64FF00", "#FF6400", "#00FF64", "#6400FF"];
    public function nextColor() : string {
        $result = next($colors);
        // if end of array reached
        if (key($colors) === null) {
            reset($colors);
        }
        return $result;
    }
}

Utiliser foreach

Boucle directe

foreach ($colors as $color) {
    echo "I am the color $color<br>";
}

Boucle avec les clés

$foods = ['healthy' => 'Apples', 'bad' => 'Ice Cream'];
foreach ($foods as $key => $food) {
    echo "Eating $food is $key";
}

Boucle par référence

Dans les boucles foreach dans les exemples ci-dessus, la modification directe de la valeur ( $color ou $food ) ne change pas sa valeur dans le tableau. L'opérateur & est requis pour que la valeur soit un pointeur de référence sur l'élément du tableau.

$years = [2001, 2002, 3, 4];
foreach ($years as &$year) {
    if ($year < 2000) $year += 2000;
}

Ceci est similaire à:

$years = [2001, 2002, 3, 4];
for($i = 0; $i < count($years); $i++) { // these two lines
    $year = &$years[$i];                // are changed to foreach by reference
    if($year < 2000) $year += 2000;
}

Concurrence

Les tableaux PHP peuvent être modifiés de quelque manière que ce soit pendant l'itération sans problèmes de concurrence (contrairement à la List Java par exemple). Si le tableau est itéré par référence, les itérations ultérieures seront affectées par les modifications apportées au tableau. Sinon, les modifications apportées au tableau n'affecteront pas les itérations ultérieures (comme si vous répétiez une copie du tableau). Comparer le bouclage par valeur:

$array = [0 => 1, 2 => 3, 4 => 5, 6 => 7];
foreach ($array as $key => $value) {
    if ($key === 0) {
        $array[6] = 17;
        unset($array[4]);
    }
    echo "$key => $value\n";
}

Sortie:

0 => 1
2 => 3
4 => 5
6 => 7

Mais si le tableau est itéré avec référence,

$array = [0 => 1, 2 => 3, 4 => 5, 6 => 7];
foreach ($array as $key => &$value) {
    if ($key === 0) {
        $array[6] = 17;
        unset($array[4]);
    }
    echo "$key => $value\n";
}

Sortie:

0 => 1
2 => 3
6 => 17

L'ensemble valeur-clé de 4 => 5 n'est plus itéré et 6 => 7 est remplacé par 6 => 17 .

Utiliser ArterObject Iterator

Le arrayiterator de PHP vous permet de modifier et de désactiver les valeurs tout en itérant sur des tableaux et des objets.

Exemple:

$array = ['1' => 'apple', '2' => 'banana', '3' => 'cherry'];

$arrayObject = new ArrayObject($array);

$iterator = $arrayObject->getIterator();

for($iterator; $iterator->valid(); $iterator->next()) {
    echo $iterator->key() . ' => ' . $iterator->current() . "</br>";
}

Sortie:

1 => apple
2 => banana
3 => cherry


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow