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