array_values()
不适用于ArrayAccess对象。 也没有array_keys()
array_values不适用于ArrayAccess对象
为什么?
,如果我能访问$object['key']
我应该能够做到所有类型的数组操作
array_values()
不适用于ArrayAccess对象。 也没有array_keys()
array_values不适用于ArrayAccess对象
为什么?
,如果我能访问$object['key']
我应该能够做到所有类型的数组操作
没有,你误会了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)));
或由(array) $ArrObj
,例如铸造成数组转换您的ArrayObject的:
var_dump(array_keys((array)$ArrObj));
请举例说明。 – powtac 2012-03-13 23:12:05
array_keys($ arrayaccessobject); ? – thelolcat 2012-03-13 23:12:58
有一个评论http://www.php.net/manual/en/class.arrayaccess.php#104061说array_key_exists()也不起作用。 – powtac 2012-03-13 23:14:06