2010-09-28 49 views
4

我使用RecursiveIteratorIterator遍历多维数组,并希望能够知道当前元素是否为深度的最后一个子元素。我想过这个:RecursiveIteratorIterator最后一个子节点

$iterator = new RecursiveIteratorIterator($array, 
    RecursiveIteratorIterator::SELF_FIRST);  
foreach ($iterator as $val) { 
    $next = clone $iterator; 
    $next->next(); 
    $lastChild = ($next->getDepth() < $iterator->getDepth()); 
} 

但RecursiveIteratorIterator说它不可复制。

+2

@Bobby:为什么SPL标签意义?这绝对是一个问题。 – 2010-09-28 09:55:49

+0

@Dennis Haarbrink:SO标签上只有42个问题,因此我不确定它是否为这个问题增加了一些有价值的东西。我也不确定这是否不会与'[php]'本身同义,因为我也没有用'[mscoree]'或'[System-Data]'标记C#问题。但是这可能值得Meta的讨论。 – Bobby 2010-09-28 10:01:55

+0

我标记为“PHP循环迭代最后孩子”,不明白你的意见。 – sod 2010-09-28 10:10:34

回答

11

短语“其深度的最后一个孩子”并不特别清楚。你能详细说明你的意思吗?这个的预期用途是什么?

如果您的意思很简单,深度将在当前元素之后改变,那么(Recursive)CachingIterator有一个方便的hasNext方法来确定迭代器是否有任何其他项目。为了让在这个问题类似于淡化例如:

$array = array(
    range(1,6), 
    range(7,8), 
    'foo' => range(1,3), 
    'bar' => range(4,5), 
); 

$rit = new RecursiveArrayIterator($array); 
$iterator = new RecursiveIteratorIterator(
    new RecursiveCachingIterator($rit), 
    RecursiveIteratorIterator::LEAVES_ONLY 
); 
foreach ($iterator as $val) { 
    $lastChild = !$iterator->hasNext(); 
    if ($lastChild) { 
     echo "$val is the last child!\n"; 
    } 
} 

输出:

6 is the last child! 
8 is the last child! 
3 is the last child! 
5 is the last child! 
+0

哦,该死......这里已经有一个实现,+1。 – VolkerK 2010-09-28 11:47:20

+1

+1好用的SPL。 – 2010-09-28 11:55:14

+2

我应该真正了解如何记录缓存迭代器。 (任何志愿者都会受到欢迎。)我相信,缺乏文档并不会让你们的生活更轻松! :) – salathe 2010-09-28 11:56:54

相关问题