[英]Nested RecursiveIteraotrs
我想使用RecursiveIterator接口遍历嵌套对象。 HeadHunterEntity对象可以具有许多CandidateEntities。 我想在主循环中迭代所有CandidateEntities,但是出了点问题。
我有这样的主循环:
$iterator = new RecursiveIteratorIterator(new RecursiveHunterCandidatesIterator(new RecursiveArrayIterator($this->getHeadHunters())));
foreach ($iterator as $object) {
echo('<br>MAIN LOOP: ' . (is_object($object) ? get_class($object) : $object));
}
RecursiveHunterCandidatesIterator
class RecursiveHunterCandidatesIterator extends RecursiveFilterIterator {
public function accept() {
echo "<br>RecursiveHunterCandidatesIterator (accept) hasChildren: " . $this->hasChildren();
return $this->hasChildren();
}
public function hasChildren() {
$current = $this->current();
echo "<br>RecursiveHunterCandidatesIterator (hasChildren) current Class: " . get_class($current);
return is_object($this->current()) ? (boolean)count($this->current()->getHuntedCandidates()) : FALSE;
}
public function getChildren() {
echo "<br>RecursiveHunterCandidatesIterator (getChildren) count: " . count($this->current()->getHuntedCandidates());
$childIterator = new RecursiveArrayIterator($this->current()->getHuntedCandidates());
$childIterator2 = new RecursiveArrayIterator(array(1,2,3));
return $childIterator;
}
}
结果出乎意料,我在主循环中没什么了:(
RecursiveHunterCandidatesIterator (hasChildren) current Class: HeadHunterEntity
RecursiveHunterCandidatesIterator (accept) hasChildren: 1
RecursiveHunterCandidatesIterator (hasChildren) current Class: HeadHunterEntity
RecursiveHunterCandidatesIterator (hasChildren) current Class: HeadHunterEntity
RecursiveHunterCandidatesIterator (getChildren) count: 2
RecursiveHunterCandidatesIterator (hasChildren) current Class: HeadHunterEntity
RecursiveHunterCandidatesIterator (accept) hasChildren:
RecursiveHunterCandidatesIterator (hasChildren) current Class: HeadHunterEntity
RecursiveHunterCandidatesIterator (hasChildren) current Class: HeadHunterEntity
RecursiveHunterCandidatesIterator (accept) hasChildren:
RecursiveHunterCandidatesIterator (hasChildren) current Class: HeadHunterEntity
但是,如果我改为返回$ childIterator2,则主循环中会出现预期的结果:
RecursiveHunterCandidatesIterator (hasChildren) current Class: HeadHunterEntity
RecursiveHunterCandidatesIterator (accept) hasChildren: 1
RecursiveHunterCandidatesIterator (hasChildren) current Class: HeadHunterEntity
RecursiveHunterCandidatesIterator (hasChildren) current Class: HeadHunterEntity
RecursiveHunterCandidatesIterator (getChildren) count: 2
MAIN LOOP: 1
MAIN LOOP: 2
MAIN LOOP: 3
RecursiveHunterCandidatesIterator (hasChildren) current Class: HeadHunterEntity
RecursiveHunterCandidatesIterator (accept) hasChildren:
RecursiveHunterCandidatesIterator (hasChildren) current Class: HeadHunterEntity
RecursiveHunterCandidatesIterator (hasChildren) current Class: HeadHunterEntity
RecursiveHunterCandidatesIterator (accept) hasChildren:
RecursiveHunterCandidatesIterator (hasChildren) current Class: HeadHunterEntity
$ this-> current()-> getHuntedCandidates()返回数组,因此它应该像$ childIterator2中的假1,2,3一样在主循环中...
我做错了什么?
我找到了解决方案。 由于RecursiveIterator的getChildren()方法必须返回RecursiveIterator的实例,因此我扩展了RecursiveArrayIterator(如果需要在此级别上过滤对象,也可以扩展RecursiveFilterIterator)。
class CandidateIterator extends RecursiveArrayIterator {
public function hasChildren() {
return false;
}
}
并且当然会在RecursiveHunterCandidatesIterator类中更改返回的迭代器:
class RecursiveHunterCandidatesIterator extends RecursiveFilterIterator {
(..)
public function getChildren() {
$childIterator = new CandidateIterator(new RecursiveArrayIterator($this->current()->getHuntedCandidates()));
return $childIterator;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.