This is a discussion on warning: rewind() supplied argument is not a valid stream resource in... within the PHP Language forums, part of the PHP Programming Forums category; i am implementing Iterator in a class, I have pretty much copied the code from php.net on Object Iteration. ...
|
|||||||
| FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
|
|||
|
i am implementing Iterator in a class, I have pretty much copied the
code from php.net on Object Iteration. Adding all the normal methods for the task...rewind, current, next, etc. I was attempting to add a seek method but am stymied by the above warnin, as well getting a seek on index 0 (zero) to work. public function __construct($contents) { if ( is_array($contents)) { if ( is_array($contents[1])) { $this->cktl = $contents[1]; } } } public function rewind() { $cktl = rewind($this->cktl); return $cktl; } public function current() { $cktl = current($this->cktl); return $cktl; } public function key() { $cktl = key($this->cktl); return $cktl; } public function next() { $cktl = next($this->cktl); return $cktl; } public function valid() { $cktl = $this->current() !== FALSE; return $cktl; } public function myseek($intPos) { $myPos = 0; $this->rewind(); while ( $myPos < $intPos && $this->valid() ) { $cktl = $this->next(); $myPos++; } if ( !$this->valid() ) { die("Invalid seek position"); } return $cktl; } |
|
|||
|
gp wrote: > i am implementing Iterator in a class, I have pretty much copied the > code from php.net on Object Iteration. Adding all the normal methods > for the task...rewind, current, next, etc. > > > public function rewind() { > > $cktl = rewind($this->cktl); > return $cktl; > } You need to use reset($this->cktl) not rewind($this->cktl), the rewind function is different to the rewind method of an iterator as it does not work on arrays and it resets the pointer position of a file handle. |
|
|||
|
aaaaarrrrrg..... i think i rewrote that function incorrectly...after going back thank you for pointing that out for me :-D i'll give it a whack gp On Oct 17, 11:28 am, "Tim Hunt" <tim.n.h...@gmail.com> wrote: > gp wrote: > > i am implementing Iterator in a class, I have pretty much copied the > > code from php.net on Object Iteration. Adding all the normal methods > > for the task...rewind, current, next, etc. > > > public function rewind() { > > > $cktl = rewind($this->cktl); > > return $cktl; > > }You need to use reset($this->cktl) not rewind($this->cktl), the rewind > function is different to the rewind method of an iterator as it does > not work on arrays and it resets the pointer position of a file handle. |
|
|||
|
Back to this issue? My seek function hates me and index 0....any ideas? > I was attempting to add a seek method but am stymied by the above > warnin, as well getting a seek on index 0 (zero) to work. > public function myseek($intPos) { > $myPos = 0; > $this->rewind(); > while ( $myPos < $intPos && $this->valid() ) { > $cktl = $this->next(); > $myPos++; > } > if ( !$this->valid() ) { > die("Invalid seek position"); > } > > return $cktl; > } |
|
|||
|
gp wrote:
> i am implementing Iterator in a class, I have pretty much copied the > code from php.net on Object Iteration. Adding all the normal methods > for the task...rewind, current, next, etc. > > I was attempting to add a seek method but am stymied by the above > warnin, as well getting a seek on index 0 (zero) to work. > <code snipped> rewind() is for files. I think you're looking for reset(). -- ================== Remove the "x" from my email address Jerry Stuckle JDS Computer Training Corp. jstucklex@attglobal.net ================== |
|
|||
|
gp wrote:
> i am implementing Iterator in a class, I have pretty much copied the > code from php.net on Object Iteration. Adding all the normal methods > for the task...rewind, current, next, etc. > > I was attempting to add a seek method but am stymied by the above > warnin, as well getting a seek on index 0 (zero) to work. <snip> > > public function myseek($intPos) { > $myPos = 0; > $this->rewind(); > while ( $myPos < $intPos && $this->valid() ) { > $cktl = $this->next(); > $myPos++; > } > if ( !$this->valid() ) { > die("Invalid seek position"); > } > > return $cktl; > } > if $intPos is 0, you never enter your while loop and therefore never execute your assignment to $cktl. Also, it's unnecessary overhead to set $cktl each time through the loop. All you really need to do is advance the pointer. Try this: public function myseek($intPos) { $myPos = 0; $this->rewind(); while ( $myPos < $intPos && $this->valid() ) { $this->next(); $myPos++; } if ( !$this->valid() ) { die("Invalid seek position"); } return $this->current(); } -- ================== Remove the "x" from my email address Jerry Stuckle JDS Computer Training Corp. jstucklex@attglobal.net ================== |