当与 SplFixedArray 一起使用时,我看到 count( $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 对象,这是正常行为吗?

最佳答案

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

https://bugs.php.net/bug.php?id=58102 上有一个为此打开的功能请求

您可以对 SplFixedArray 进行 sublass 并使其实现 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

10-08 04:34