2012-03-13 95 views
4

array_values()不适用于ArrayAccess对象。 也没有array_keys()array_values不适用于ArrayAccess对象

为什么?

,如果我能访问$object['key']我应该能够做到所有类型的数组操作

+0

请举例说明。 – powtac 2012-03-13 23:12:05

+0

array_keys($ arrayaccessobject); ? – thelolcat 2012-03-13 23:12:58

+0

有一个评论http://www.php.net/manual/en/class.arrayaccess.php#104061说array_key_exists()也不起作用。 – powtac 2012-03-13 23:14:06

回答

4

没有,你误会了ArrayAccess的效用。它不仅仅是一个数组的封装。是的,实现它的标准示例使用私有的$array变量,其功能由类包装,但这不是特别有用的变量。通常,你可能只是使用一个数组。

ArrayAccess的一个很好的例子是当脚本不知道哪些变量可用时。

作为一个相当愚蠢的例子,设想一个与远程服务器一起工作的对象。该服务器上的资源可以通过网络上的API读取,更新和删除。程序员决定用类似数组的语法来包装该功能,因此$foo['bar'] = 'foobar'将该服务器上的bar资源设置为foobarecho $foo['bar']将检索该资源。脚本没有办法找出没有尝试所有可能的值的键或值。

因此,ArrayAccess允许使用数组语法来设置,更新,检索或从类似数组的语法中删除对象:不多也不少。

另一个接口Countable允许使用count()。你可以在同一个类上使用两个接口。理想情况下,会有更多这样的接口,可能包括那些可以做array_valuesarray_keys,但目前它们不存在的接口。

2

ArrayAccess是非常有限的。它不允许使用原生array_函数(没有现有接口)。

如果您需要对您的对象执行更多类似数组的操作,那么您基本上正在创建一个集合。一个集合应该被其方法操纵。

因此,创建一个对象并扩展ArrayObject。这实现了IteratorAggregate,Traversable,ArrayAccess,SerializableCountable

如果您需要的按键,只需添加一个array_keys方法:

public function array_keys($search_value = null, $strict = false) 
{ 
    return call_user_func_array('array_keys', array($this->getArrayCopy(), $search_value, $strict)); 
} 

然后,您可以:

foreach ($object->array_keys() as $key) { 
    echo $object[$key]; 
} 
0

ArrayObject/ArrayAccess允许对象为数组工作,但他们仍然对象。因此,而不是array_keys()(只对数组工作),你应该使用get_object_vars(),例如:

var_dump(array_keys(get_object_vars($ArrObj))); 

或由(array) $ArrObj,例如铸造成数组转换您的ArrayObject的:

var_dump(array_keys((array)$ArrObj));