2010-08-22 2 views
4

я следующий класс:Почему класс, который реализует ArrayAccess, Iterator и Countable, не работает с array_filter()?

<?php 

/* 
* Abstract class that, when subclassed, allows an instance to be used as an array. 
* Interfaces `Countable` and `Iterator` are necessary for functionality such as `foreach` 
*/ 
abstract class AArray implements ArrayAccess, Iterator, Countable 
{ 
    private $container = array(); 

    public function offsetSet($offset, $value) 
    { 
     if (is_null($offset)) { 
      $this->container[] = $value; 
     } else { 
      $this->container[$offset] = $value; 
     } 
    } 

    public function offsetExists($offset) 
    { 
     return isset($this->container[$offset]); 
    } 

    public function offsetUnset($offset) 
    { 
     unset($this->container[$offset]); 
    } 

    public function offsetGet($offset) 
    { 
     return isset($this->container[$offset]) ? $this->container[$offset] : null; 
    } 

    public function rewind() { 
      reset($this->container); 
    } 

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

    public function key() { 
      return key($this->container); 
    } 

    public function next() { 
      return next($this->container); 
    } 

    public function valid() { 
      return $this->current() !== false; 
    } 

    public function count() { 
    return count($this->container); 
    } 

} 

?> 

Тогда, у меня есть еще один класс, подклассы AArray:

<?php 

require_once 'AArray.inc'; 

class GalleryCollection extends AArray { } 

?> 

Когда я заполняю экземпляр GalleryCollection с данными, а затем попытаться использовать его в array_filter() , в первом аргументе я получаю следующую ошибку:

Warning: array_filter() [function.array-filter]: The first argument should be an array in 

Спасибо!

ответ

7

Потому что array_filter работает только с массивами.

Посмотрите другие варианты, например FilterIterator, или сначала создайте массив из своего объекта.

+0

Знаете ли вы, возможно ли расширить класс Array и использовать экземпляр этого расширения в 'array_filter()'? –

+3

Это невозможно, и 'array' не является классом (php 5.3). – VolkerK

+5

@letseatfood, 'array_filter' будет работать только на вещи, которые имеют тип' array' в PHP ... не 'object', поскольку любые экземпляры классов будут. Если вы хотите получить массив из итератора, используйте ['iterator_to_array()'] (http://php.net/iterator_to_array). Чтобы фильтровать значения в итераторе, как сказал Artefacto, вы должны использовать 'FilterIterator'. – salathe

Смежные вопросы