【问题标题】:PHP RecursiveIteratorIterator: Can you call getSubIterator() with a depth greater than your current depth?PHP RecursiveIteratorIterator:你可以调用深度大于当前深度的 getSubIterator() 吗?
【发布时间】:2014-07-02 19:15:33
【问题描述】:

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

请看:RecursiveIteratorIterator::getSubIterator

public RecursiveIterator RecursiveIteratorIterator::getSubIterator ([ int $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);
}

【问题讨论】:

    标签: php spl


    【解决方案1】:

    RecursiveIteratorIterator::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);
    } /* }}} */
    

    ——来自PHP 5.5.14 source

    这个问题的关键部分是if 声明:

    if (level < 0 || level > object->level) {
        RETURN_NULL();
    }
    

    代码是不言自明的,但它是说:

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

    【讨论】:

    • 有道理,我们不能假设递归迭代器已经在递归树中迭代得足够远,以至于知道下一个子迭代器的样子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 2019-10-01
    • 2014-06-19
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多