Следующий метод Итератора для ассоциативного массива
Я хочу использовать ассоциативный массив с итератором PHP:
http://php.net/manual/en/class.iterator.php
Возможно ли это?
Я определил эти методы:
public function rewind(){
reset($this->_arr);
$this->_position = key($this->_arr);
}
public function current(){
return $this->_arr[$this->_position];
}
public function key(){
return $this->_position;
}
public function next(){
++$this->_position;
}
public function valid(){
return isset($this->_arr[$this->_position]);
}
проблема в том, что он не выполняет правильную итерацию. Я получаю только один элемент.
Я думаю, это из-за кода ++$this->_position
в методе next(), который не имеет никакого эффекта, потому что _position - это строка (ключ ассоциативного массива).
так как я могу перейти к следующему элементу массива этого типа?
Ответы
Ответ 1
function rewind() {
reset($this->_arr);
}
function current() {
return current($this->_arr);
}
function key() {
return key($this->_arr);
}
function next() {
next($this->_arr);
}
function valid() {
return key($this->_arr) !== null;
}
Ответ 2
Почему бы не создать ArrayObject
из вашего ассоциативного Array
? Тогда вы можете getIterator()
из этого ArrayObject
и вызвать key()
, next()
и т.д. На нем, как хотите...
Пример:
$array = array('one' => 'ONE', 'two' => 'TWO', 'three' = 'THREE');
// create ArrayObject and get it iterator
$ao = new ArrayObject($my_array);
$it = $ao->getIterator();
// looping
while($it->valid()) {
echo "Under key {$it->key()} is value {$it->current()}";
$it->next();
}
ArrayObject
ArrayIterator
Ответ 3
http://ideone.com/Fxt0j
class myIterator implements Iterator {
private $position = 0;
private $keys;
public function __construct(array $arr) {
$this->array = $arr;
$this->keys = array_keys($arr);
$this->position = 0;
}
function rewind() {
$this->position = 0;
}
function current() {
return $this->array[$this->key()];
}
function key() {
return $this->keys[$this->position];
}
function next() {
++$this->position;
}
function valid() {
return isset($this->keys[$this->position]);
}
}
$it = new myIterator(array(
'a' => "firstelement",
'b' => "secondelement",
'c' => "lastelement",
));
foreach($it as $key => $value) {
var_dump($key, $value);
echo "\n";
}
Ответ 4
class MyItrator implements Iterator
{
private $_arr;
public function __construct(array $arr)
{
$this->_arr = $arr;
}
public function rewind()
{
reset($this->_arr);
}
public function current()
{
return current($this->_arr);
}
public function key()
{
return key($this->_arr);
}
public function next()
{
next($this->_arr);
}
public function valid()
{
return isset($this->_arr[key($this->_arr)]);
}
}
Ответ 5
Я знаю, что это старый вопрос, но он может быть таким же простым, как
public function current()
{
return $this->array[array_keys($this->array)[$this->position]];
}
public function next()
{
++$this->position;
}
public function key()
{
return array_keys($this->array)[$this->position];
}
public function valid()
{
return array_key_exists($this->position, array_keys($this->array)[$this->position]);
}
public function rewind()
{
$this->position = 0;
}
Я знаю, что аналогичный ответ был отправлен @zerkms, но imho, который не работает, если объект уже сконструирован, и у вас есть функциональность, которая расширяет массив