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
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
不,您误解了 ArrayAccess 的实用性。它不仅仅是数组的一种包装器。是的,实现它的标准示例使用一个私有$array
变量,其功能由类包装,但这并不是一个特别有用的变量。通常,您也可以只使用一个数组。
ArrayAccess 的一个很好的例子是脚本不知道哪些变量可用。
作为一个相当愚蠢的例子,想象一个与远程服务器一起工作的对象。可以通过网络使用 API 读取、更新和删除该服务器上的资源。程序员决定他们想用类似数组的语法包装该功能,因此将该服务器上$foo['bar'] = 'foobar'
的资源设置为并检索它。如果不尝试所有可能的值,该脚本无法找出存在哪些键或值。bar
foobar
echo $foo['bar']
因此 ArrayAccess 允许使用数组语法来设置、更新、检索或删除具有类似数组语法的对象:不多也不少。
另一个界面 ,Countable
允许使用count()
. 您可以在同一个类上使用这两个接口。理想情况下,会有更多这样的接口,可能包括那些可以做array_values
或的接口array_keys
,但目前它们不存在。
ArrayAccess
非常有限。它不允许使用本机array_
函数(没有现有接口)。
如果您需要对对象执行更多类似数组的操作,那么您实际上是在创建一个集合。一个集合应该由它的方法来操作。
因此,创建一个对象并扩展ArrayObject。这实现了IteratorAggregate
、Traversable
、ArrayAccess
和。Serializable
Countable
如果您需要密钥,只需添加一个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];
}
/允许对象作为数组工作ArrayObject
,ArrayAccess
但它们仍然是对象。因此,您应该使用 代替array_keys()
(仅适用于数组)get_object_vars()
,例如:
var_dump(array_keys(get_object_vars($ArrObj)));
或通过将 ArrayObject 转换为数组 by 来转换它(array) $ArrObj
,例如:
var_dump(array_keys((array)$ArrObj));