2010-06-14 48 views
3

當聲明PHP中的數組,該指數的可出的順序創建...即PHP陣列效率和存儲器澄清

數組[1] = 1 陣列[19] = 2 數組[4] = 3

我的問題。在創建這樣的數組時,長度是19,中間是空值?如果我試圖獲取數組[3]它會來作爲未定義或拋出一個錯誤?另外,這如何影響記憶。 3個指數的記憶會被記錄下來還是19個?

而且目前的顯影劑寫了一個腳本用3個陣列FailedUpdates [] FailedDeletes [] FailedInserts []

它是更有效的做這種方式,或者做在一個關聯陣列的情況下控制若干子陣列

"Failures" array(){ 
    ["Updates"] => array(){ 
      [0] => 12 
      [1] => 41 
        } 
    ["Deletes"] => array(){ 
      [0] => 122 
      [1] => 414 
      [1] => 43 
        } 
    ["Inserts"] => array(){ 
      [0] => 12 
        } 
} 

回答

4

內存效率並不是真正需要在PHP中擔心的事情,除非您處理的是真正巨大的數組/大量的變量。

PHP中的數組並不像C++或類似的低級語言中的數組; PHP中的數組是一張地圖。你有一個鍵列表(它必須是唯一的,並且是所有類型的字符串或整數),以及與這些鍵相對應的值列表。所以下面的是一個合法的數組:

array(0 => 'butt', 1 => 'potato', 2 => 'tulip')

但這樣是

array(5 => 'i', 'barry' => 6, 19 => array(-1 => array(), 7 => 'smock'))

在這兩種情況下,有在陣列中的3項條目,因此3鍵和3個值。

除了數組中的鍵和值之外,還可以通過訂單來區分一個數組,其中鍵/值對發生。如果你定義一個數組使其具有非負整數作爲鍵,這通常是預期的順序。當您使用像foreach()這樣的結構時,訂單很重要。

+1

您可以使用SPLFixedArray使用C風格的數組。創建時間並不快(速度提高了幾個百分點),但訪問速度提高了20%到30%...... – ircmaxell 2010-06-14 14:51:06

+0

「如果您定義的數組具有非負整數作爲鍵,則這通常是預期順序。」順序與鍵的類型無關,只與鍵創建的順序無關。在OP給出的例子中,訂單將是1,19,3. – Artefacto 2010-06-14 14:52:42

+0

Artefacto:是的,我知道。我的評論不是作爲一個明確的規則,而是作爲一般原則。很多時候當你創建一個數組時,你需要定義第0個條目,然後是第1個,然後是第2個等等。在這種情況下,這些鍵將按照預期的順序排列。當數組返回由返回非負整數索引的數組的函數時,通常也會發生這種情況。如果數組元素被定義爲「自然」順序,那麼是的,它們將按照它們定義的順序發生。 – Hammerite 2010-06-14 15:05:17

1

陣列[3]將未定義的/復位但不導致錯誤,並且該陣列將使用的只讀存儲器爲3個值 - PHP是不喜歡C其中您一定要看那些東西。

1
  • 訪問$ arr [3]給出通知:Notice: Undefined offset: 3 in /data/home/sjoerd/public_html/svnreps/test/a.php on line 3。你可以通過檢查isset()array_key_exists()來避免這種情況。
  • 沒有存儲空值。
  • 有空元素不會佔用額外的內存。
  • 是否應該使用多個變量或數組取決於上下文以及如何使用變量。