PHP COUNT_RECURSIVE和SplFixedArray

时间:2012-09-05 15:25:31

标签: php spl

SplFixedArray一起使用时,我看到一些奇怪的行为($ arr,COUNT_RECURSIVE)。拿这段代码,例如......

$structure = new SplFixedArray( 10 );

for( $r = 0; $r < 10; $r++ )
{
    $structure[ $r ] = new SplFixedArray( 10 );
    for( $c = 0; $c < 10; $c++ )
    {
        $structure[ $r ][ $c ] = true;
    }
}

echo count( $structure, COUNT_RECURSIVE );

结果...

> 10

你会期望110的结果。这是正常的行为,因为我正在嵌套SplFixedArray对象吗?

1 个答案:

答案 0 :(得分:6)

SplFixedArray实现Countable,但Countable不允许参数,因此您不能计算递归。 The argument is ignored.您可以从SplFixedArray::countCountable::count的方法签名中看到这一点。

https://bugs.php.net/bug.php?id=58102

处打开了功能请求

您可以对SplFixedArray进行子类化并使其实现RecursiveIterator,然后重载count方法以使用iterate_count,但随后它将始终计算所有元素,例如它始终是COUNT_RECURSIVE。也可以添加专用方法。

class MySplFixedArray extends SplFixedArray implements RecursiveIterator
{
    public function count()
    {
        return iterator_count(
            new RecursiveIteratorIterator(
                $this,
                RecursiveIteratorIterator::SELF_FIRST
            )
        );
    }

    public function getChildren()
    {
        return $this->current();
    }

    public function hasChildren()
    {
        return $this->current() instanceof MySplFixedArray;
    }
}

demo