【问题标题】:RecursiveIteratorIterator last childRecursiveIteratorIterator 最后一个孩子
【发布时间】:2011-04-18 05:08:38
【问题描述】:

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

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

但是 RecursiveIteratorIterator 说它不可克隆。

【问题讨论】:

  • @Bobby:为什么 spl 标签没有意​​义?这绝对是一个 spl 问题。
  • @Dennis Haarbrink:SO 上只有 42 个问题标记为[SPL],所以我不确定它是否为问题增加了一些价值。我也不确定这是否与[php] 本身不是同义词,因为我也不用[mscoree][System-Data] 标记C# 问题。但这可能值得在 Meta 上进行讨论。
  • 我标记了“php loops iterator last-child”,不懂你的 cmets。
  • @Bobby:我想如果标签存在并且它是活动的(当然是对问题的描述),你应该使用它。当然,它是否是一个有价值的标签是有争议的。
  • @sod:检查问题的修订历史。我添加了 spl-tag,但被 Bobby 删除了。

标签: php loops iterator spl


【解决方案1】:

“其深度的最后一个孩子”这句话不是特别清楚。您能否详细说明您的意思;预期用途?

如果您的意思很简单,深度将在当前元素之后发生变化,那么(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!

【讨论】:

  • 我真的应该开始记录缓存迭代器。 (欢迎任何志愿者。)我敢肯定,缺乏文档并没有让你们的生活更轻松! :)
  • 几乎整整六年后,它仍然没有变得更容易......
  • 在 PHP 7.2 中,代码因“数组到字符串的转换”而崩溃。 RecursiveCachingIterator 发生了什么变化?
  • @temuri 它不会 crash (默认情况下),但会在 PHP 5.4 中发出 E_NOTICE,因为缓存迭代器会尝试将数组转换为字符串迭代。这是因为RecursiveCachingIterator 构造函数的$flags 参数的默认值是RecursiveCachingIterator::CALL_TOSTRING。要不让它这样做,您可以将0RecursiveCachingIterator:: TOSTRING_USE_KEYRecursiveCachingIterator:: TOSTRING_USE_CURRENT 传递给$flags 参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
  • 2012-02-09
  • 1970-01-01
  • 2022-11-10
  • 2011-11-08
  • 1970-01-01
相关资源
最近更新 更多