是否可以聲明一個數組元素鍵而不定義它的值(如非數組變量)?這樣,如果你有一個布爾值的關聯數組,你只需要檢查該鍵是否存在而不是分配一個布爾值。但是當你檢查一個鍵是否存在時,你仍然可以不必遍歷數組。PHP關聯數組鍵只有
這將是一個節省空間的措施。看起來'空'會分配空間。
是否可以聲明一個數組元素鍵而不定義它的值(如非數組變量)?這樣,如果你有一個布爾值的關聯數組,你只需要檢查該鍵是否存在而不是分配一個布爾值。但是當你檢查一個鍵是否存在時,你仍然可以不必遍歷數組。PHP關聯數組鍵只有
這將是一個節省空間的措施。看起來'空'會分配空間。
不可以。數組元素總是有鍵和值,但是如果你不在意(即空字符串),你可以放任何值作爲你的值。在你的情況下,你應該把這些鍵添加到你的數組中,它們的值是true
。然後當你會找到它,並將無法找到你可以假設這是錯誤的。但總的來說,你做錯了事。你並不是真的在這裏儲蓄,而是讓你的代碼不清楚,難以閱讀和維護。不要這樣做
如果你不希望有一個字典結構就像在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中的第二條建議。內存消耗應該與數值數組相同,但搜索操作是優化的。
是的,這是可能的。您也可以使用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';
沒有密鑰就不可能有數組值。您不能使用自己的密鑰,但在這種情況下,輸入將被分配自己的唯一密鑰 – 2013-04-10 19:58:04
問題問您是否可以有一個鍵,沒有價值,而不是相反。您當然可以擁有一個已分配值爲null的密鑰。 – gview 2013-04-10 20:00:26
但空值獲得分配空間嗎? – user528451 2013-04-10 20:06:42
如果我理解正確。 您計劃使用關聯數組是這樣的:
key value
"bool1" ""
"bool2" ""
"bool3" ""
如果一個鍵存在,那麼布爾是「真」。
爲什麼不直接使用普通的數組,如果該值存在這樣?:
key value
1 "bool1"
2 "bool2"
3 "bool3"
,那麼布爾是「真」。
然後,與O(1)中的密鑰查找相比,檢查值是否存在需要O(n)個時間。 – user2340939 2017-09-11 21:14:08
這聽起來有點像過早優化。這真的有必要嗎?你有數據證明這是必要的嗎? – 2013-04-10 19:50:52
我並不是說這是必要的,但如果可以的話,我想節省空間。 – user528451 2013-04-10 19:52:07
這是倒退。爲什麼不把「key」作爲字符串值存儲在數組中並使用'array_search()'。不存在值==布爾值未設置。 – 2013-04-10 19:52:37