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++;
}
Zacyklí se to v PHP verze 5 a nižší. V PHP verze 7 to proběhne jen 3x.
3v4l.org/b4HFo
Davex
Profil
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
No to je zajímavé. To zase zacyklí PHP7, ale ne PHP5. 3v4l.org/gZBT0
Davex
Profil
Vypadá to, že v PHP7 se změnila implementace foreach a je tam opravené chování foreach z PHP5.
Alphard
Profil
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ě)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: