érdekes foreach működés
Sziasztok!
Egy érdekes működésre lettem figyelmes. Lehet, hogy ez normális. Ez esetben homályosítsatok fel lécci.Ezt lefuttatva a végeredmény a következő:A kérdésem a következő: Miért íródik felül az utolsó érték az utolsó előtti értékkel referenciaátadásos iterálás után, ha újra ugyanazokkal változónevekkel. (Ha megváltoztatom a második ciklusban az elemnek szánt változónevet, akkor az értékek helyesek maradnak.)
Én úgy tudtam, hogy a foreachen belül deklarált változók a foreachet elhagyva elhalnak.
Amennyiben az 1. foreach után beszúrok egy unset($element); sort, minden rendben működik. Csak ezt azért nem értem, mert ezen a "szinten" ilyen változót nem is hoztunk létre.
Bónuszkérdés: mi az a jel a második és harmadik var_dump-olt tömb utolsó eleme előtt? Miért nem ismeri fel int-nek?
Üdv Karesz
■ Egy érdekes működésre lettem figyelmes. Lehet, hogy ez normális. Ez esetben homályosítsatok fel lécci.
<?php
// tömb feltöltése
$array = array();
for($i = 0; $i < 5; $i++) { $array[] = $i; }
var_dump($array);
// Iterálás referenciaátadással
foreach( $array as &$element) { }
echo "<hr/>";
var_dump($array);
// Iterálás referenciaátadás nélkül
foreach( $array as $element) { }
echo "<hr/>";
var_dump($array);
?>
array(5) { [0]=> int(0) [1]=> int(1) [2]=> int(2) [3]=> int(3) [4]=> int(4) }
array(5) { [0]=> int(0) [1]=> int(1) [2]=> int(2) [3]=> int(3) [4]=> ∫(4) }
array(5) { [0]=> int(0) [1]=> int(1) [2]=> int(2) [3]=> int(3) [4]=> ∫(3) }
Én úgy tudtam, hogy a foreachen belül deklarált változók a foreachet elhagyva elhalnak.
Amennyiben az 1. foreach után beszúrok egy unset($element); sort, minden rendben működik. Csak ezt azért nem értem, mert ezen a "szinten" ilyen változót nem is hoztunk létre.
Bónuszkérdés: mi az a jel a második és harmadik var_dump-olt tömb utolsó eleme előtt? Miért nem ismeri fel int-nek?
Üdv Karesz
parancssor
Itt az kimenet parancssorból (ezen látszik, hogy az utolsó értékek referenciák):
közben
Közben rájöttem, hogy &int -et jelentheti, mivel kipróbáltam sztringgel is és ott egyértelműen látszott a &string megjelölés...
Akkor mostmár ketten vagyunk akik kiváncsiak rá:)
foreachben deklarált változó
Ettől függetlenül szerintem ez egyértelműen bug.
(Update: http://bugs.php.net/bug.php?id=29992 de szerintük nem bug)
De van itt még érdekesebb is:
manuálban benne van
szóval a második foreachben a belső változó valójában egy hivatkozás az előző bejárás miatt az utolsó elemre a bejárandó tömbből. ez azért van így mert referenciát adsz át (az első esetben) és a foreachen kívül is elérhető lesz ez a változó. az, hogy elérhető az egy dolog, de ráadásul a bejárás végén (lsd.: foreach működése) a pointer értéke az utolsó elemen lesz (erre fog mutatni a változó), majd terminál a ciklus. utána az utolsó eleme az utolsó elem referencia lesz mivel minden változónév referencia lesz ha arra a változóra készült egy referencia (php manual). a második bejárás során az utolsó előtti értékkel fog állni az utolsó elemre mutató referencia az utolsó előtti elem látogatásakor, mivel ezt az értéket kapja épp meg (a bejárás során mindig az aktuális elemét kapja meg a tömbnek:)). majd elérünk az utolsó elemre amikoris a változó értéke, az utolsó előtti elem lesz, mivel az utolsó elem értéke az előbb az utolsó előtti elem lett. ez egy referencia lesz, mivel amire van referencia maga is referencia, tehát az utolsó helyen az utolsó előtti elem mint referencia fog állni. érdekes mókás vicces.
Ezt érti valaki?
igen
Tényleg benne van a manuálban és bug report is indult róla.
Értem mostmár, hogy miért - bár nekem valahogy az angol magyarázat könnyebben emészthető volt:)
Php fejlesztők sem értenek 100%-ban egyet ezen a viselkedésen, de ahogy látom ez már így marad.
Üdv Mindenkinek!
változók működése PHP-ban
Üdv,
Felhő
unset