Autor | Zpráva | ||
---|---|---|---|
sjiamnocna Profil |
Ahoj.
Do semináře ICT mám otázku PHP. Chci se zeptat, zda se dá nějak zacyklit foreach (procházení pole), nebo ne? Zacyklením samozřejmě myslím špatnou podmínku iterace/neměnnou hodnotu v podmínce, působící nekonečné opakování bloku kódu. Díky :) BTW, mám svůj názor, ale nechci matur. otázku jen tak odbýt, jen protože nevím, jak bych to zacyklil. |
||
Davex Profil |
sjiamnocna:
Pokud nebude pracovat s „kopií“ pole, ale s referencí na původní pole, tak by se zacyklení dalo vyvolat, ale nekonečné ne, protože jednou při tom dojde volná paměť. |
||
Keeehi Profil |
Zacyklit to jde, pokud do foreache předáš špatně implementovaný iterátor.
<?php class MyIterator implements Iterator { private $var = array(); public function __construct($array) { if (is_array($array)) { $this->var = $array; } } public function rewind() { reset($this->var); } public function current() { return current($this->var); } public function key() { return key($this->var); } public function next() { $var = next($this->var); if($var === false) { $this->rewind(); $this->current(); } return $var; } public function valid() { return true; } } $values = array(1,2,3); $it = new MyIterator($values); foreach ($it as $a => $b) { print "$a: $b\n"; } Práce s referencí o které nejspíš psal Davex. $array = [5, 6, 7]; $ref = &$array; $next = 8; foreach($ref as $value) { echo "$value\n"; $array[] = $next++; } 3v4l.org/b4HFo |
||
Davex Profil |
#4 · Zasláno: 24. 1. 2017, 20:02:08
Myslel jsem trochu jinou referenci, ale to je asi jedno, protože příkladů na zacyklení se určitě dá vymyslet víc.
<?php $a = [1]; foreach ($a as &$x) { $a[] = $x + 1; } |
||
Keeehi Profil |
#5 · Zasláno: 24. 1. 2017, 20:08:00
No to je zajímavé. To zase zacyklí PHP7, ale ne PHP5. 3v4l.org/gZBT0
|
||
Davex Profil |
#6 · Zasláno: 24. 1. 2017, 20:47:59
Vypadá to, že v PHP7 se změnila implementace
foreach a je tam opravené chování foreach z PHP5.
|
||
Alphard Profil |
#7 · Zasláno: 24. 1. 2017, 21:54:17
sjiamnocna:
„Chci se zeptat, zda se dá nějak zacyklit foreach (procházení pole), nebo ne?“ Doplním trochu jiný pohled. Tu závorku o procházení pole jste tam dopsal vy, nebo je v zadání? Protože on foreach nemusí procházet jen pole, ale může tam být naimplementovaný např. generátor něčeho, který bude validně vracet výsledky, dokud se budeme ptát, klidně donekonečna. Viz např. php.net/manual/en/language.generators.syntax.php#111969. |
||
sjiamnocna Profil |
Tu závorku jsem tam dal, protože foreach jsem zatím použil pro procházení hodnot pole ($i=>$v)
Zadání není, jen pátrám ;) Jinak díky za odpovědi :) Určitě to použiji (ne v kódu, samozřejmě) |
||
Časová prodleva: 6 let
|
0