2012-03-13 33 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));