6

array_values() doesn't work with ArrayAccess object. neither does array_keys()

why?

if I can access $object['key'] I should be able to do all kind of array operations

4

3 回答 3

5

不,您误解了 ArrayAccess 的实用性。它不仅仅是数组的一种包装器。是的,实现它的标准示例使用一个私有$array变量,其功能由类包装,但这并不是一个特别有用的变量。通常,您也可以只使用一个数组。

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

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

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

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

于 2012-03-13T23:17:45.020 回答
3

ArrayAccess非常有限。它不允许使用本机array_函数(没有现有接口)。

如果您需要对对象执行更多类似数组的操作,那么您实际上是在创建一个集合。一个集合应该由它的方法来操作。

因此,创建一个对象并扩展ArrayObject。这实现了IteratorAggregateTraversableArrayAccess和。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];
}
于 2012-03-13T23:28:15.297 回答
0

/允许对象作为数组工作ArrayObjectArrayAccess但它们仍然是对象。因此,您应该使用 代替array_keys()(仅适用于数组)get_object_vars(),例如:

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

或通过将 ArrayObject 转换为数组 by 来转换它(array) $ArrObj,例如:

var_dump(array_keys((array)$ArrObj));
于 2015-12-10T17:50:23.813 回答