Wytłumaczenie działania pętli foreach na przykładzie

0

Nie wiem dlaczego dla indeksu 3 wychodzi 6 a nie 8

<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}

foreach ($arr as $key => $value) {

    echo "{$key} => {$value} ";
    print_r($arr);
}

// Wynik jest taki:
// 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 )
?>

Tablica po tym pierwszym foreach wychodzi chyba (2,4,6,8) więc dlaczego ( [0] => 2, [1] => 4, [2] => 6,** [3] => 2 **) ?? Albo 3 => 6 Array ?

2

Po pętli foreach, gdy zmienna iterująca wartość ustawiona jest na przekazywanie przez referencję, powinieneś ją zwolnić:

foreach ($arr as &$value) {
    $value = $value * 2;
}
unset($value);

(widnieje to zresztą także w dokumentacji: http://php.net/manual/en/control-structures.foreach.php)

Jeśli tej zmiennej nie zwolnisz, nadpisze ona przy najbliższej możliwej okazji ostatni element, na który wskazywała (czyli przeważnie ostatni element tablicy): http://ideone.com/RvrI2v

1 użytkowników online, w tym zalogowanych: 0, gości: 1