久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      深析PHP數(shù)組是怎么靈活支持多數(shù)據(jù)類型

      本篇文章給大家?guī)砹岁P(guān)于PHP的相關(guān)知識,其中主要跟大家介紹數(shù)組是怎么靈活支持多數(shù)據(jù)類型的,感興趣的朋友下面一起來看一下吧,希望對大家有幫助。

      深析PHP數(shù)組是怎么靈活支持多數(shù)據(jù)類型

      在PHP中,數(shù)組數(shù)據(jù)結(jié)構(gòu)的應(yīng)用處理是使用頻率非常高的,相對于Java、C++ 這種強(qiáng)類型語言來說,PHP的數(shù)組簡直可以說是太好用了,可以存儲各種類型的數(shù)據(jù)(如:數(shù)字、字符串甚至對象等),為開發(fā)帶來了極大的便利。

      基于 PHP 數(shù)組的強(qiáng)大特性,我們可以輕易實現(xiàn)更加復(fù)雜的數(shù)據(jù)結(jié)構(gòu),比如棧、隊列、列表、集合、字典等。

      深析PHP數(shù)組是怎么靈活支持多數(shù)據(jù)類型

      你是否迫不及待的想要一探究竟:PHP到底是如何實現(xiàn)數(shù)組的呢?

      1、PHP數(shù)組底層數(shù)據(jù)結(jié)構(gòu)

      PHP 數(shù)組其內(nèi)部是使用 HashTable 結(jié)構(gòu)來實現(xiàn)的,那就先來簡單說說HashTable吧!

      HashTable又稱散列表,是通過key-value的方式來高效地訪問數(shù)據(jù)的一種結(jié)構(gòu)。哈希表是數(shù)組和鏈表的一種合并,集成了數(shù)組的尋址快,鏈表的插入快的特點于一身。

      深析PHP數(shù)組是怎么靈活支持多數(shù)據(jù)類型

      HashTable主要分為兩個環(huán)節(jié):

      1. 哈希函數(shù):哈希函數(shù)將要查找的值轉(zhuǎn)換成數(shù)字索引,通過數(shù)字索引可以快速的找到值存在的位置。

      2. 哈希碰撞:理想情況下,不同的值通過哈希函數(shù)后,出來的結(jié)果是不一樣的;如果不一樣的值,哈希后出來一樣的數(shù)字,我們稱之為哈希碰撞。

      因此應(yīng)用 HashTable 就必須要面臨解決哈希碰撞的問題,主要的解法有兩種:鏈表法,開放尋址法。

      在zend_type.h文件中,可以找到 HashTable 的主要結(jié)構(gòu)定義如下:

      zend_數(shù)組 類型

      挑選幾個重點成員介紹一下:

      • gc: 引用計數(shù),垃圾回收使用。

      • arData:散列表中保存存儲元素的數(shù)組,其內(nèi)存是連續(xù)的,arData指向數(shù)組的起始位置;

      • nTableSize:數(shù)組的總?cè)萘?,即可以容納的元素數(shù),arData 的內(nèi)存大小就是根據(jù)這個值確定的,它的大小的是2的冪次方,最小為8,然后按照 8、16、32…依次遞增;

      深析PHP數(shù)組是怎么靈活支持多數(shù)據(jù)類型

      Bucket 類型

      Bucket 的結(jié)構(gòu)比較簡單,主要用來保存元素的 key 和 value,以及一個整型的 h(散列值,或者叫哈希值)。

      • 如果元素是數(shù)值索引,則其值就是數(shù)值索引的值;

      • 如果是字符串索引,那么其值就是 key 通過 Time33 算法計算得到的散列值。

      h 的值用來最終映射元素的存儲位置。

      深析PHP數(shù)組是怎么靈活支持多數(shù)據(jù)類型

      2、PHP 數(shù)組的基本實現(xiàn)

      上面部分我們了解了 zend_數(shù)組 的數(shù)據(jù)結(jié)構(gòu),那接著看看數(shù)組的初始化吧:

      深析PHP數(shù)組是怎么靈活支持多數(shù)據(jù)類型

      數(shù)組的初始化主要是針對 HashTable 成員的設(shè)置,初始化時并不會立即分配 arData 的內(nèi)存,插入第一個元素之后才會分配 arData 的內(nèi)存。

      為了更好的理解整個hash結(jié)構(gòu),我們來舉個例子說明一下這個結(jié)構(gòu):

      $data = array(     'hello' => 'haha',     1       => 'me to'     'world' => 'world',      2       => 2 ); unset($data[1]);
      登錄后復(fù)制

      那上面的hash結(jié)構(gòu)應(yīng)該是什么樣的呢?arData存儲的結(jié)果應(yīng)該是什么樣呢?

      畫個圖例來看看吧,更直觀一些:

      深析PHP數(shù)組是怎么靈活支持多數(shù)據(jù)類型

      arData是Bucket類型的指針,用來具體存儲每個元素的key,value,按照插入元素的順序存儲數(shù)據(jù)的,所以數(shù)組的順序也是靠這個來保證。

      每個arData數(shù)組的元素,從圖中可以看到,左邊負(fù)數(shù)是哈希值取模后的值,存儲的是右邊arData的索引;如-8沖突了,則存儲了鏈表的頭元素。

      arData[0]: key='hello',h=xx(具體某個值),val = 'haha'

      arData[1]: val是 type=IS_UNDEF 的zval(被unset后,不是立即被刪除,而是置成IS_UNDEF)

      arData[2]: key='world',h=xx(具體某個值),val = 'world'

      arData[3]: key=NULL,h=2(可能會哈希值沖突),val = 2

      ….

      上面的例子很具體地解釋了nNumUsed,nNumOfElements,arData的意義。

      3、PHP 數(shù)組的有序性

      數(shù)組中各元素的順序和插入順序一致,這個是怎么實現(xiàn)的呢?

      為了實現(xiàn) PHP 數(shù)組的有序性,PHP 底層的散列表在散列函數(shù)與元素數(shù)組之間加了一層映射表,這個映射表也是一個數(shù)組,大小和存儲元素的數(shù)組相同,存儲元素的類型為整型,用于保存元素在實際存儲的有序數(shù)組中的下標(biāo) —— 元素按照先后順序依次插入實際存儲數(shù)組,然后將其數(shù)組下標(biāo)按照散列函數(shù)散列出來的位置存儲在新加的映射表中:

      深析PHP數(shù)組是怎么靈活支持多數(shù)據(jù)類型

      這樣,就可以完成最終存儲數(shù)據(jù)的有序性了。

      PHP 數(shù)組底層結(jié)構(gòu)中并沒有顯式標(biāo)識這個中間映射表,而是與 arData 放到了一起,在數(shù)組初始化的時候并不僅僅分配用于存儲 Bucket 的內(nèi)存,還會分配相同數(shù)量的 uint32_t 大小的空間,這兩塊空間是一起分配的,然后將 arData 偏移到存儲元素數(shù)組的位置,而這個中間映射表就可以通過 arData 向前訪問到。

      總結(jié)

      PHP中的數(shù)組其特點就是將 values 映射到 keys 的類型。與其他語言不同的是,PHP中數(shù)組的 key 可以是字符串,而values可以是任意類型。

      除常規(guī)增刪改查之外,數(shù)組還有很多其他操作,比如復(fù)制、合并、銷毀、重置等,這些操作對應(yīng)的代碼都位于 zend_hash.c 中,感興趣的同學(xué)可以去了解一下。

      推薦學(xué)習(xí):《PHP視頻教程》

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號