Muy bien zerokilled, el primero es la mejor forma, para evitar problemas, tal vez la segunda puede presentar cosas inesperadas. Ahora para que veas el comportamiento,
Si hicieramos esto
Código PHP:
Ver original<?php
$colors = array('red', 'blue', 'green', 'yellow');
foreach ($colors as &$color){}
Cada vez que se modifica
$color se modifica el último valor del array.
Imprime algo así
Código PHP:
Ver original [0]=>
string(3) "red"
[1]=>
string(4) "blue"
[2]=>
string(5) "green"
[3]=>
&string(6) "yellow"
}
["GLOBALS"]=>
*RECURSION*
["_POST"]=>
}
["_GET"]=>
}
["_COOKIE"]=>
}
["_FILES"]=>
}
["colors"]=>
[0]=>
string(3) "red"
[1]=>
string(4) "blue"
[2]=>
string(5) "green"
[3]=>
&string(6) "yellow"
}
["color"]=>
&string(6) "yellow"
}
Si te fijas se creo una variable (así como en el global lo muestra) llamada
$color que hace referencia al último array que tiene como valor
yellow (lógicamente) este es una referencia. Ahora, cuando se ejecuta un segundo
foreach, cada vez se modifica el valor
$color y este modifica el último valor del array. Por eso queda como valor green, porque es el último valor indicado. Es decir el segundo array lo que hace es algo como
Código PHP:
Ver originalarray(4) { [0]=> string
(3) "red" [1]=> string
(4) "blue" [2]=> string
(5) "green" [3]=> &string
(6) "yellow" }
$color = 'red';
array(4) { [0]=> string
(3) "red" [1]=> string
(4) "blue" [2]=> string
(5) "green" [3]=> &string
(6) "red" }
$color = 'blue';
array(4) { [0]=> string
(3) "red" [1]=> string
(4) "blue" [2]=> string
(5) "green" [3]=> &string
(6) "blue" }
$color = 'green';
array(4) { [0]=> string
(3) "red" [1]=> string
(4) "blue" [2]=> string
(5) "green" [3]=> &string
(6) "green" }
// lógicamente el último valor es
$color = 'green';
array(4) { [0]=> string
(3) "red" [1]=> string
(4) "blue" [2]=> string
(5) "green" [3]=> &string
(6) "green" }
Cada vez que se modifica
$color se modifica el último valor del array.