【问题标题】:array_values doesn't work with ArrayAccess objectarray_values 不适用于 ArrayAccess 对象
【发布时间】:2012-03-30 09:57:42
【问题描述】:

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

为什么?

如果我可以访问$object['key'],我应该可以进行各种数组操作

【问题讨论】:

  • array_keys($arrayaccessobject); ?
  • 有评论php.net/manual/en/class.arrayaccess.php#104061说array_key_exists()也不起作用。
  • 您能否扩展您的问题并显示 $arrayaccessobject 类的完整代码?
  • 你是否实现了一个返回数组的function offsetGet()

标签: php arrayaccess


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    所以,创建一个对象并扩展ArrayObject。这实现了IteratorAggregateTraversableArrayAccessSerializableCountable

    如果您需要密钥,只需添加一个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];
    }
    

    【讨论】:

      【解决方案3】:

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

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

      或通过(array) $ArrObj 将您的 ArrayObject 转换为数组,例如:

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

      【讨论】:

        猜你喜欢
        • 2012-10-19
        • 1970-01-01
        • 2021-04-28
        • 1970-01-01
        • 2016-05-14
        • 2015-01-06
        • 2015-07-18
        • 2015-05-08
        • 1970-01-01
        相关资源
        最近更新 更多