2011-01-10 28 views

回答

38

docs

數組和對象不能被用作密鑰。這樣做會導致警告:非法偏移類型。

您可以給每個實例一個唯一的ID或覆蓋__toString(),使它返回一些獨特的東西,例如,

$array[(string) $instance] = 42; 
2

只有integers and strings are allowed as array keys。如果您絕對需要該功能,則可以編寫一個實現ArrayAccess的類。

+1

它不會允許您將對象用作數組鍵。它允許的唯一的事情就是將對象當作一個數組來處理,所以對象的屬性將成爲鍵。 – 2014-07-29 16:25:14

+1

它將允許你使用對象作爲鍵。有關示例實現,請參見http://pastebin.com/fzqeFswJ。 – Oswald 2014-07-30 06:18:57

+0

我明白你的意思了,這很有道理。我的意思是它不允許你使用對象作爲_array_鍵。但是,是的,它將允許您使用對象作爲ArrayAccess對象的關鍵點 – 2014-08-01 19:33:14

13

您可以使用http://www.php.net/manual/en/class.splobjectstorage.php

$product = new Product("cat"); 
$sales = new SplObjectStorage(); 
if(isset($sales[$product])){ 
    $sales[$product]++; 
} 
else{ 
    $sales[$product] = 1; 
} 

這不是一個真正的數組,但有類似數組的功能和語法像樣的數目。然而,由於它是一個對象,由於其奇怪的foreach行爲,它在php中的行爲就像一個不適合,並且它與所有本地php數組函數不兼容。有時你會發現它有用通過

$arr = iterator_to_array($sales); 

將其轉換爲一個真正的數組,以便它起到很好的與你的代碼的其餘部分。

0

如果對象是由new stdClass()所做的簡單預定義的類,那麼使用json_encode這個類的json表示可能是有效的選項。

$product = new stdClass(); 
$product->brand = "Acme"; 
$product->name = "Patator 3.14"; 

$product_key = json_encode($product); 

if(isset($sales[$product_key])){ 
    $sales[$product_key]++; 
} 
else{ 
    $sales[$product_key] = 1; 
} 

但請記住,兩個對象的平等始終是商業模式的選擇,必須仔細設計。

相關問題