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