2016-08-03 6 views
0

Kann mir jemand erklären, warum key() funktioniert nicht in for Schleife richtig?ArrayIterator-Schlüssel() funktioniert nicht in For-Schleife?

Beispiel

$iterator = new \ArrayIterator(range(1,3)); 
for ($iterator->seek(0); $iterator->key() < 3; $iterator->next()) { 
    echo "{$iterator->key()} => {$iterator->current()}", PHP_EOL; 
} 

Es Unendlich-Schleife zurück, aber wenn ich zweiten Ausdruck for Schleife auf ändern: $iterator->key() < 2 zeigt es nicht letztes Element. Kann mir jemand erklären warum?

Ich brauche zwei Elemente angezeigt werden, auf X-Zeiger in Array ändern, dann 3 Elemente anzuzeigen, Zeiger in Array auf Y ändern, dann 2 Elemente anzuzeigen ... usw.

+2

Das Problem ist, dass Sie nach dem letzten Element mit der Taste 2 zum nächsten Element mit 'next()' gehen und Sie danach nicht mehr haben. Wenn Sie also den Schlüssel von einem Element erhalten, das nicht mit 'key()' existiert, wird NULL zurückgegeben. Im numerischen Kontext mit 'key <3' wird der Schlüssel, NULL, in eine ganze Zahl umgewandelt. Also ist NULL 0 und 0 ist kleiner als 3. Das verursacht die Endlosschleife. Verwenden Sie '$ iterator-> valid()' in Ihrem Bedingungsteil der for-Schleife, um immer sicherzustellen, dass Sie ein gültiges Element haben. – Rizier123

+0

Huckepack auf was @ Rizier123 sagte. So etwas wie 'if ($ iterator-> valid()) { echo "{$ iterator-> key()} => {$ iterator-> current()}", PHP_EOL; } sonst { sterben (0); // oder was auch immer } ' – Andrew

Antwort

0

Sie haben soeben foreach

verwenden könnten
foreach ($iterator as $key => $value) { 
    // Do the things you gotta do here... 
} 

Ich denke, Sie fragen nicht nach einer Lösung, Sie wollen nur wissen, warum. Wie andere bereits erklärt haben, ist der 0ternull< 3 und bleibt auch so.