<?php
interface FastEnumeration extends IteratorAggregate
{
};
interface FastEnumerator extends Iterator
{
};
define('EnumerationConcurrent', 0);
define('EnumerationReverse', 1);
class Enumerator implements FastEnumerator
{
private $arr;
private $reversed;
function __construct(array &$arr, $reversed = 0) {
$this->reversed = $reversed;
$this->arr = $arr;
if ($this->reversed) {
end($this->arr);
}
}
public function first() {
if ($this->reversed) {
$cnt = count($this->arr);
$idx = $cnt > 1 ? $cnt - 1 : 0;
} else {
$idx = 0;
}
return $this->arr[$idx];
}
public function last() {
if ($this->reversed) {
$idx = 0;
} else {
$cnt = count($this->arr);
$idx = $cnt > 1 ? $cnt - 1 : 0;
}
return $this->arr[$idx];
}
public function isfirst() {
if ($this->reversed) {
$cnt = count($this->arr);
$idx = $cnt > 1 ? $cnt - 1 : 0;
} else {
$idx = 0;
}
return key($this->arr) == $idx;
}
public function islast() {
if ($this->reversed) {
$idx = 0;
} else {
$cnt = count($this->arr);
$idx = $cnt > 1 ? $cnt - 1 : 0;
}
return key($this->arr) == $idx;
}
public function rewind() {
if ($this->reversed) {
end($this->arr);
} else {
reset($this->arr);
}
}
public function current() {
return current($this->arr);
}
public function key() {
return key($this->arr);
}
public function end() {
if ($this->reversed) {
reset($this->arr);
} else {
end($this->arr);
}
}
public function next() {
if ($this->reversed) {
return prev($this->arr);
} else {
return next($this->arr);
}
}
public function prev() {
if ($this->reversed) {
return next($this->arr);
} else {
return prev($this->arr);
}
}
public function valid() {
$current = $this->current();
return !empty($current) && $current != null;
}
};
class MArray implements FastEnumeration
{
private $arr;
public function getIterator() {
return new Enumerator($this->arr);
}
public function reverseEnumerator() {
return new Enumerator($this->arr, EnumerationReverse);
}
public function concurrentEnumerator() {
return new Enumerator($this->arr, EnumerationConcurrent);
}
// ...
};
/* EOF */ ?>
On Sat, Jan 2, 2010 at 8:47 AM, Oskar Eisemuth <[email protected]> wrote:
> Hello
>
> Would it be possible to add functions to know the relative internal array
> position?
>
> I found "[PHP-DEV] RFC array functions" from 2006, but nothing really
> changed.
>
> The need to use next, prev in combination is ridiculous compared to a clean
> array_hasmore or array_pos_islast, as the internals already know this.
> To get an array_valid_position or array_pos_isvalid wouldn't be bad either.
>
> So would it possible to introduce:
>
> array_pos_isfirst(& $array)
> array_pos_islast(& $array)
> array_pos_isvalid(& $array)
>
>
> Best regards
> Oskar Eisemuth
>
>
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php