La documentación dice que tiene que devolver un RecursiveIterator, en tu caso los nodos implementan dicha interface, así que lo que único que tienes que hacer es devolver el elemento actual.
Aunque yo no utilizaría un contador, podría ser así(deje solo esencial, para que quede mas claro el ejemplo):
Código PHP:
Ver originalclass Node implements RecursiveIterator, Countable
{
/**
* @var string
*/
private $name;
/**
* @var array
*/
private $childrens = array();
/**
* @var Node
*/
private $parent;
/**
* @param string $name
* @param Node|null $parent
*/
public function __construct($name, $parent = null)
{
$this->name = $name;
$this->parent = $parent;
}
/**
* @param Node $n
* @return Node provide fluent interface
*/
public function addChild(Node $n)
{
$n->setParent($this);
$this->childrens[] = $n;
return $this;
}
/**
* @return string $name
*/
public function getName()
{
return $this->name;
}
/**
* @param Node $n
* @return Node provide fluent interface
*/
public function setParent(Node $n)
{
$this->parent = $n;
return $this;
}
/**
* Countable Interface
*/
{
return count($this->childrens); }
/**
* RecrusiveIterator Interface
*/
public function getChildren()
{
}
public function hasChildren()
{
return count($this->childrens) > 0 ?
true : false; }
{
}
{
}
return key($this->childrens); }
{
}
public function valid()
{
}
}
Debes recordar que para iterar sobre todos los nodos hay que envolver el RecursiveIterator en un RecursiveIteratorIterator, un ejemplo:
Código PHP:
Ver original$node = new Node('Root');
$child1 = new Node('Node 1');
$child1->addChild(new Node('Node 1.1'));
$child1->addChild(new Node('Node 1.2'));
$child1->addChild(new Node('Node 1.3'));
$node->addChild($child1);
$node->addChild(new Node('Node 2'));
$node->addChild(new Node('Node 3'));
foreach(new RecursiveIteratorIterator($node,
RecursiveIteratorIterator::SELF_FIRST) as $child) {
echo $child->getName() . ' :: ' . count($child) . PHP_EOL
; }
En cuanto a que trabajas con XML, hay un iterator para ese caso tambien
SimpleXMLIterator, el cual implementa RecursiveIterator y Countable.
Saludos.