PHP RecursiveIterator:您可以调用深度大于当前深度的getSubIterator()吗?

PHP RecursiveIterator:您可以调用深度大于当前深度的getSubIterator()吗?,php,spl,Php,Spl,当使用\RecursiveIteratorIterator的实例进行递归迭代时,在查找深度大于当前深度的子迭代器时,它是否总是返回null 请参阅: 公共递归迭代器递归迭代器::GetSub迭代器([ 整数$level]) 例如: $innerIterator = new \RecursiveArrayIterator([/*a recursive array*/]); $iterator = new \RecursiveIteratorIterator($innerIterator); fo

当使用
\RecursiveIteratorIterator
的实例进行递归迭代时,在查找深度大于当前深度的子迭代器时,它是否总是返回
null

请参阅:

公共递归迭代器递归迭代器::GetSub迭代器([ 整数$level])

例如:

$innerIterator = new \RecursiveArrayIterator([/*a recursive array*/]);
$iterator = new \RecursiveIteratorIterator($innerIterator);

foreach ($iterator as $value) {
    $depth       = $iterator->getDepth();
    $parentDepth = $depth - 1;
    $childDepth  = $depth + 1;
    // returns \RecursiveArrayIterator
    $iterator->getSubIterator($depth);
    // returns null first iteration and \RecursiveArrayIterator thereafter
    $iterator->getSubIterator($parentDepth);
    // always returns null...should it?
    $iterator->getSubIterator($childDepth);
}

recursiveIterator::getSubIterator()
方法的源代码足够短,可以发布在这里,是找到答案的好地方

/* {{{ proto RecursiveIterator RecursiveIteratorIterator::getSubIterator([int level])
   The current active sub iterator or the iterator at specified level */
SPL_METHOD(RecursiveIteratorIterator, getSubIterator)
{
    spl_recursive_it_object   *object = (spl_recursive_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
    long  level = object->level;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &level) == FAILURE) {
        return;
    }
    if (level < 0 || level > object->level) {
        RETURN_NULL();
    }
    RETURN_ZVAL(object->iterators[level].zobject, 1, 0);
} /* }}} */
代码很容易解释,但它说:


如果指定的级别小于零,或大于当前对象的级别,则返回null

递归迭代器::GetSub迭代器()方法的源代码足够短,可以发布在此处,并且是查找答案的最佳位置

/* {{{ proto RecursiveIterator RecursiveIteratorIterator::getSubIterator([int level])
   The current active sub iterator or the iterator at specified level */
SPL_METHOD(RecursiveIteratorIterator, getSubIterator)
{
    spl_recursive_it_object   *object = (spl_recursive_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
    long  level = object->level;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &level) == FAILURE) {
        return;
    }
    if (level < 0 || level > object->level) {
        RETURN_NULL();
    }
    RETURN_ZVAL(object->iterators[level].zobject, 1, 0);
} /* }}} */
代码很容易解释,但它说:


如果指定的级别小于零,或大于当前对象的级别,则返回null

是有意义的,我们不能假设递归迭代器已经在递归树下进行了足够的迭代,以了解下一个子迭代器的外观。有意义,我们不能假设递归迭代器已经在递归树中进行了足够多的迭代,从而知道下一个子迭代器是什么样子。