PHP 8.5.0 Released!

The IteratorAggregate interface

(PHP 5, PHP 7, PHP 8)

Introduction

Interface to create an external Iterator.

Interface synopsis

interface IteratorAggregate extends Traversable {
/* Methods */
}

Examples

Example #1 Basic usage

<?php

class myData implements IteratorAggregate
{
public
$property1 = "Public property one";
public
$property2 = "Public property two";
public
$property3 = "Public property three";
public
$property4 = "";

public function
__construct()
{
$this->property4 = "last property";
}

public function
getIterator(): Traversable
{
return new
ArrayIterator($this);
}
}

$obj = new myData();

foreach (
$obj as $key => $value) {
var_dump($key, $value);
echo
"\n";
}

?>

The above example will output something similar to:

string(9) "property1"
string(19) "Public property one"
string(9) "property2"
string(19) "Public property two"
string(9) "property3"
string(21) "Public property three"
string(9) "property4"
string(13) "last property"

Table of Contents

Found A Problem?

Learn How To Improve This PageSubmit a Pull RequestReport a Bug
+add a note

User Contributed Notes 4 notes

up
33
trumbull dot j at gmail dot com
8 years ago
It might seem obvious, but you can return a compiled generator from your IteratorAggregate::getIterator() implementation.
<?php
class Collection implements IteratorAggregate
{
 private $items = [];
 public function __construct($items = [])
 {
 $this->items = $items;
 }
 public function getIterator()
 {
 return (function () {
 while(list($key, $val) = each($this->items)) {
 yield $key => $val;
 }
 })();
 }
}
$data = [ 'A', 'B', 'C', 'D' ];
$collection = new Collection($data);
foreach ($collection as $key => $val) {
 echo sprintf("[%s] => %s\n", $key, $val);
}
?>
up
22
Tab Atkins
13 years ago
Note that, at least as of 5.3, you still aren't allowed to return a normal Array from getIterator().
In some places, the docs wrap the array into an ArrayObject and return that. DON'T DO IT. ArrayObject drops any empty-string keys on the floor when you iterate over it (again, at least as of 5.3).
Use ArrayIterator instead. I wouldn't be surprised if it didn't have its own set of wonderful bugs, but at the very least it works correctly when you use it with this method.
up
10
Martin Speer
6 years ago
You can use yield from in getIterator in recent PHP 7 versions: 
<?php 
class Example implements \IteratorAggregate
{
 protected $data = [];
 public function __construct(array $data) 
 {
 $this->data = $data;
 }
 public function getIterator() 
 {
 yield from $this->data;
 }
}
$test = new Example([1, 2, 3]);
foreach ($test as $node) {
 echo $test, PHP_EOL;
}
/*
 * Outputs:
 *
 * 1
 * 2
 * 3 
 */ ?>
up
13
Lubaev.K
12 years ago
<?php
// IteratorAggregate
// Create indexed and associative arrays.
class myData implements IteratorAggregate {
 private $array = [];
 const TYPE_INDEXED = 1;
 const TYPE_ASSOCIATIVE = 2;
 public function __construct( array $data, $type = self::TYPE_INDEXED ) {
 reset($data);
 while( list($k, $v) = each($data) ) {
 $type == self::TYPE_INDEXED ?
 $this->array[] = $v :
 $this->array[$k] = $v;
 }
 }
 public function getIterator() {
 return new ArrayIterator($this->array);
 }
}
$obj = new myData(['one'=>'php','javascript','three'=>'c#','java',], /*TYPE 1 or 2*/ );
foreach($obj as $key => $value) {
 var_dump($key, $value);
 echo PHP_EOL;
}
// if TYPE == 1
#int(0)
#string(3) "php"
#int(1)
#string(10) "javascript"
#int(2)
#string(2) "c#"
#int(3)
#string(4) "java"
// if TYPE == 2
#string(3) "one"
#string(3) "php"
#int(0)
#string(10) "javascript"
#string(5) "three"
#string(2) "c#"
#int(1)
#string(4) "java"
?>

Good luck!
+add a note

AltStyle によって変換されたページ (->オリジナル) /