2

ArrayAccess および Iterator インターフェイスを実装するオブジェクトのキーを反復処理する方法はありますか? 配列アクセスは魅力的ですが、それらのオブジェクトに対して foreach を使用することはできません。出来ますか?私はこれまでにそのようなコードを持っています:

<?php
class IteratorTest implements ArrayAccess, Iterator {
  private $pointer = 0;

  public function offsetExists($index) {
    return isset($this->objects[$index]);
  }

  public function offsetGet($index) {
    return $this->objects[$index];
  }

  public function offsetSet($index, $newValue) {
    $this->objects[$index] = $newValue;
  }

  public function offsetUnset($index) {
    unset($this->objects[$index]);
  }

  public function key() {
    return $this->pointer;
  }

  public function current() {
    return $this->objects[$this -> pointer];
  }

  public function next() {
    $this->pointer++;
  }

  public function rewind() {
    $this->pointer = 0;
  }

  public function seek($position) {
    $this->pointer = $position;
  }

  public function valid() {
    return isset($this->objects[$this -> pointer]);
  }
}

$it = new IteratorTest();

$it['one'] = 1;
$it['two'] = 2;

foreach ($it as $k => $v) {
  echo "$k: $v\n";
}

// expected result:
// one: 1
// two: 2

助けとヒントをありがとう。

4

2 に答える 2

3

これを使用してイテレータを実装します。多分あなたはあなたのコードに適応することができます;)

class ModelList implements Iterator{
public $list;
private $index = 0;
public $nb;
public $nbTotal;

/**
 * list navigation
 */
public function rewind(){$this->index = 0;}
public function current(){$k = array_keys($this->list);$var = $this->list[$k[$this->index]];return $var;}
public function key(){$k = array_keys($this->list);$var = $k[$this->index];return $var;}
public function next(){$k = array_keys($this->list);if (isset($k[++$this->index])) {$var = $this->list[$k[$this->index]];return $var;} else {return false;}}
public function valid(){$k = array_keys($this->list);$var = isset($k[$this->index]);return $var;}
/**
 * 
 * Constructor
 */
public function __construct() {
    $this->list = array();
    $this->nb = 0;
    $this->nbTotal = 0;
    return $this;
}
}
于 2012-04-02T08:56:28.760 に答える
2
while ($it->valid()) {
    echo $it->key().' '.$it->current();
    $it->next();
}

私のアプローチになりますが、この関数は不確かに見えます:

 public function next() {
    $this->pointer++;
 }

「1」を増やしても「2」になる可能性は低いです。次の配列キーを取得するには、この質問に対する回答のコードを試してください。

$keys = array_keys($this->objects);
$position = array_search($this->key(), $keys);
if (isset($keys[$position + 1])) {
    $this->pointer = $keys[$position + 1];
} else {
    $this->pointer = false;
}
于 2012-04-02T08:34:47.717 に答える