2012-09-05 3 views
4

Я вижу некоторое нечетное поведение со счетом ($ arr, COUNT_RECURSIVE) при использовании с SplFixedArray. Возьмите этот блок кода, например ...PHP COUNT_RECURSIVE и SplFixedArray

$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?

ответ

6

SplFixedArray реализует Countable, но Countable не допускает аргументов, поэтому вы не можете считать рекурсивным. The argument is ignored. Вы можете увидеть это из подписи метода SplFixedArray::count и Countable::count.

Существует функция запроса открыта для этого в https://bugs.php.net/bug.php?id=58102


Вы можете sublass 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

+1

Именно то, что я искал. Я проверил это утром, но ничего не мог найти. Я знал, что я что-то пропускаю. Благодаря! – wlvrn