PHP Foreach Pass per riferimento: l'ultimo elemento duplicato? (Bug?)



Answers

$item è un riferimento a $arr[2] e viene sovrascritto dal secondo ciclo foreach come evidenziato da animuson.

foreach ($arr as &$item) { /* do nothing by reference */ }
print_r($arr);

unset($item); // This will fix the issue.

foreach ($arr as $item) { /* do nothing by value */ }
print_r($arr); // $arr has changed....why?
Question

Ho appena avuto un comportamento molto strano con un semplice script php che stavo scrivendo. L'ho ridotto al minimo necessario per ricreare il bug:

<?php

$arr = array("foo",
             "bar",
             "baz");

foreach ($arr as &$item) { /* do nothing by reference */ }
print_r($arr);

foreach ($arr as $item) { /* do nothing by value */ }
print_r($arr); // $arr has changed....why?

?>

Questo produce:

Array
(
    [0] => foo
    [1] => bar
    [2] => baz
)
Array
(
    [0] => foo
    [1] => bar
    [2] => bar
)

Si tratta di un bug o di un comportamento davvero strano che dovrebbe accadere?







questo perché si usa la direttiva ref (&). l'ultimo valore sarà sostituito dal secondo ciclo e corromperà l'array. la soluzione più semplice è usare un nome diverso per il secondo ciclo:

foreach ($arr as &$item) { ... }

foreach ($arr as $anotherItem) { ... }



Related