4

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 オブジェクトをネストしているため、これは正常な動作ですか?

4

1 に答える 1

6

SplFixedArrayを実装しますCountableCountable、引数を許可しないため、再帰をカウントすることはできません。引数は無視されます。SplFixedArray::countこれは、とのメソッドシグネチャから確認できますCountable::count

https://bugs.php.net/bug.php?id=58102でこれについて開いている機能リクエストがあります


サブラスSplFixedArrayして実装させてから、使用するメソッドをRecursiveIteratorオーバーロードすることができますが、そうすると、常にすべての要素がカウントされます。ただし、専用のメソッドを追加することもできます。countiterate_countCOUNT_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;
    }
}

デモ

于 2012-09-05T15:30:44.493 に答える