2013-04-10 98 views
3

是否可以聲明一個數組元素鍵而不定義它的值(如非數組變量)?這樣,如果你有一個布爾值的關聯數組,你只需要檢查該鍵是否存在而不是分配一個布爾值。但是當你檢查一個鍵是否存在時,你仍然可以不必遍歷數組。PHP關聯數組鍵只有

這將是一個節省空間的措施。看起來'空'會分配空間。

+2

這聽起來有點像過早優化。這真的有必要嗎?你有數據證明這是必要的嗎? – 2013-04-10 19:50:52

+1

我並不是說這是必要的,但如果可以的話,我想節省空間。 – user528451 2013-04-10 19:52:07

+0

這是倒退。爲什麼不把「key」作爲字符串值存儲在數組中並使用'array_search()'。不存在值==布爾值未設置。 – 2013-04-10 19:52:37

回答

2

不可以。數組元素總是有鍵和值,但是如果你不在意(即空字符串),你可以放任何值作爲你的值。在你的情況下,你應該把這些鍵添加到你的數組中,它們的值是true。然後當你會找到它,並將無法找到你可以假設這是錯誤的。但總的來說,你做錯了事。你並不是真的在這裏儲蓄,而是讓你的代碼不清楚,難以閱讀和維護。不要這樣做

1

如果你不希望有一個字典結構就像在accoc數組,然後你只想要一組值,就像這樣:

$array = ('red', 'green', 'blue'); 

要檢查重點(項目)只是存在使用in_array()

if(in_array('red', $array)) { 
    // -> found 
} 

但是,你要注意,PHP在這種情況下,將在內部創建數字indicies。


另一種方式去將分配TRUE所有值。這至少會減少記憶。如使用isset()像這樣

$array (
    'red' => TRUE, 
    'green' => TRUE, 
    'blue' => TRUE 
); 

,並檢查是否存在:

if(isset($array['red'])) { 
    // -> found 
} 

注意:我不會建議你用NULL的價值。這是因爲在這種情況下您不能使用isset(),因爲如果鍵的值爲NULL,isset將返回false。在這種情況下,您必須使用array_key_exists(),這比isset()慢得多。


結論:就處理器和內存消耗而言,我會建議PHP中的第二條建議。內存消耗應該與數值數組相同,但搜索操作是優化的。

+0

你說這些條目沒有鍵,這是不正確的。 – 2013-04-10 19:56:47

+0

確實他們有數字*鍵*(或更好的指數),但這是與PHP – hek2mgl 2013-04-10 19:57:41

+0

@WebnetMobile你現在快樂嗎? – hek2mgl 2013-04-10 20:03:25

-1

是的,這是可能的。您也可以使用array_key_exists來檢查這些值。 PHP從實際的數據存儲中分離變量名稱的哈希映射(如果您感興趣,可以在谷歌zval上)。有了這個說法,陣列還必須爲每個元素都有一個相關的「桶」結構,這取決於你的操作系統和編譯選項可以高達96字節/每個。順便說一句,Zvals也有多達48個字節。

我不認爲有你打算從這個計劃獲得多少價值但是任何機會,而純粹是從假設的角度來看,你可以存儲一個空值。

<?php 

$foo = array('a' => null, 'b' => null); 

if (array_key_exists('a', $foo)) 
    echo 'a'; 

但是,如果與初始化爲布爾值相比,這並不會節省任何內存。然後,它會讓你做一個isset,比對array_key_exists進行函數調用要快。

<?php 
$foo = array('a' => true, 'b' => true); 

if (isset($foo['a'])) 
    echo 'a'; 
+0

沒有密鑰就不可能有數組值。您不能使用自己的密鑰,但在這種情況下,輸入將被分配自己的唯一密鑰 – 2013-04-10 19:58:04

+0

問題問您是否可以有一個鍵,沒有價值,而不是相反。您當然可以擁有一個已分配值爲null的密鑰。 – gview 2013-04-10 20:00:26

+0

但空值獲得分配空間嗎? – user528451 2013-04-10 20:06:42

1

如果我理解正確。 您計劃使用關聯數組是這樣的:

key  value 
"bool1" "" 
"bool2" "" 
"bool3" "" 

如果一個鍵存在,那麼布爾是「真」。

爲什麼不直接使用普通的數組,如果該值存在這樣?:

key value 
1  "bool1" 
2  "bool2" 
3  "bool3" 

,那麼布爾是「真」。

+0

然後,與O(1)中的密鑰查找相比,檢查值是否存在需要O(n)個時間。 – user2340939 2017-09-11 21:14:08