Szukaj…


Składnia

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

Uwagi

Porównanie metod iteracji tablicy

metoda Korzyść
foreach Najprostsza metoda iteracji tablicy.
foreach przez odniesienie Prosta metoda iteracji i zmiany elementów tablicy.
for z przyrostowym indeksem Umożliwia iterację tablicy w dowolnej sekwencji, np. Pomijanie lub cofanie wielu elementów
Wskaźniki tablicy wewnętrznej Nie jest już konieczne używanie pętli (aby można było iterować po każdym wywołaniu funkcji, odebraniu sygnału itp.)

Iterowanie wielu tablic razem

Czasami trzeba razem iterować dwie tablice tej samej długości, na przykład:

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

array_map to najprostszy sposób na osiągnięcie tego:

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

który wyświetli:

Tim likes chicken
Tony likes beef
Turanga likes slurm

Można to zrobić za pomocą wspólnego indeksu:

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

Jeśli dwie tablice nie mają kluczy przyrostowych, można array_values($array)[$i] aby zastąpić $array[$i] .

Jeśli obie tablice mają tę samą kolejność kluczy, możesz także użyć pętli foreach z kluczem na jednej z tablic:

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

Oddzielne tablice można zapętlać tylko wtedy, gdy mają tę samą długość i mają tę samą nazwę klucza. Oznacza to, że jeśli nie podasz klucza i są one ponumerowane, wszystko będzie dobrze, lub jeśli nadasz nazwę kluczom i umieścisz je w tej samej kolejności w każdej tablicy.

Możesz także użyć array_combine .

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

Następnie możesz przejść przez to, robiąc to samo co poprzednio:

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

Korzystanie z indeksu przyrostowego

Ta metoda polega na zwiększaniu liczby całkowitej od 0 do największego indeksu w tablicy.

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

Pozwala to również na iterację tablicy w odwrotnej kolejności bez użycia array_reverse , co może spowodować obciążenie, jeśli tablica jest duża.

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

Za pomocą tej metody można łatwo pominąć lub przewinąć indeks.

$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++;
    }
}

Wynik:

alpha
beta
gamma
beta
zeta
epsilon

Dla tablic, które nie mają indeksów przyrostowych (w tym tablic z indeksami w odwrotnej kolejności, np. [1 => "foo", 0 => "bar"] , ["foo" => "f", "bar" => "b"] ), nie można tego zrobić bezpośrednio. array_values lub array_keys może być stosowany zamiast:

$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";
}

Używanie wewnętrznych wskaźników tablicy

Każda instancja tablicy zawiera wewnętrzny wskaźnik. Manipulując tym wskaźnikiem, różne elementy tablicy można pobrać z tego samego wywołania w różnym czasie.

Za pomocą each

Każde wywołanie each() zwraca klucz i wartość bieżącego elementu tablicy i zwiększa wewnętrzny wskaźnik tablicy.

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

Korzystanie z next

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

Zauważ, że w tym przykładzie założono, że żadne elementy w tablicy nie są identyczne z wartością logiczną false . Aby temu zapobiec, użyj key aby sprawdzić, czy wskaźnik wewnętrzny osiągnął koniec tablicy:

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

Ułatwia to także iterację tablicy bez bezpośredniej pętli:

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;
    }
}

Korzystanie z foreach

Pętla bezpośrednia

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

Pętla z kluczami

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

Pętla przez odniesienie

W pętlach foreach w powyższych przykładach modyfikowanie wartości ( $color lub $food ) bezpośrednio nie zmienia jej wartości w tablicy. Operator & jest wymagany, aby wartość była wskaźnikiem odniesienia do elementu w tablicy.

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

Jest to podobne do:

$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;
}

Konkurencja

Tablice PHP mogą być modyfikowane w dowolny sposób podczas iteracji bez problemów z współbieżnością (w przeciwieństwie do np. List Java). Jeśli tablica jest iterowana przez odwołanie, na późniejsze iteracje będą miały wpływ zmiany w tablicy. W przeciwnym razie zmiany w tablicy nie wpłyną na późniejsze iteracje (tak jak w przypadku iteracji kopii tablicy). Porównaj zapętlenie według wartości:

$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";
}

Wynik:

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

Ale jeśli tablica jest iterowana w odniesieniu do,

$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";
}

Wynik:

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

Zestaw klucz-wartość 4 => 5 nie jest już iterowany, a 6 => 7 zmienia się na 6 => 17 .

Korzystanie z ArrayObject Iterator

Phiter arrayiterator pozwala modyfikować i usuwać wartości podczas iteracji po tablicach i obiektach.

Przykład:

$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>";
}

Wynik:

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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow