成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[PHP源碼閱讀]array_push和array_unshift函數(shù)

HackerShell / 2201人閱讀

摘要:對(duì)于函數(shù),實(shí)現(xiàn)時(shí)新建一個(gè)哈希表,將需要插入的數(shù)據(jù)先插入到中,然后再把原來的數(shù)組數(shù)據(jù)寫入到中,這樣實(shí)現(xiàn)在數(shù)組前面插入數(shù)據(jù)元素的功能。這次閱讀源碼過程中,同時(shí)也研究了中的哈希表數(shù)據(jù)結(jié)構(gòu)及一些,也給自己補(bǔ)充了一些哈希表的知識(shí)。

在PHP中,在數(shù)組中添加元素也是一種很常用的操作,分別有在數(shù)組尾部和頭部添加元素,看看PHP內(nèi)部是如何實(shí)現(xiàn)數(shù)組插入的操作。

我在github有對(duì)PHP源碼更詳細(xì)的注解。感興趣的可以圍觀一下,給個(gè)star。PHP5.4源碼注解??梢酝ㄟ^commit記錄查看已添加的注解。

array_push
int array_push ( array &$array , mixed $value1 [ , mixed $... ] )

array_push函數(shù)將array參數(shù)看做一個(gè)棧,將傳遞進(jìn)來的變量壓倒array的尾部。array的長度隨著被壓進(jìn)去的變量個(gè)數(shù)增加。下面的代碼有意義的效果:

 $array[] = $var; 

如果只需要添加一個(gè)元素到數(shù)組,使用$array[] 這種方式更好,因?yàn)檫@樣做不用調(diào)用函數(shù)。

運(yùn)行示例
$arr = array();
array_push($arr, 1, 2, 3); // return 3; $arr = [1, 2, 3]
運(yùn)行步驟

array_push函數(shù)相對(duì)比較簡單,就相當(dāng)于壓棧操作,把a(bǔ)rray看做一個(gè)棧,然后對(duì)每一個(gè)參數(shù),讓其變成引用,引用數(shù)加一,然后添加它到數(shù)組的尾部。

內(nèi)部實(shí)現(xiàn)的流程圖如下:

源碼解讀

添加元素使用了zend_hash_next_index_insert函數(shù),此函數(shù)是_zend_hash_next_index_insert函數(shù)的宏定義,這個(gè)函數(shù)是PHP內(nèi)部實(shí)現(xiàn)數(shù)組的數(shù)據(jù)結(jié)構(gòu)--哈希表包含的一些API,這個(gè)API用于追加元素到哈希表或者更新哈希表中已有的哈希值。此函數(shù)實(shí)現(xiàn)的流程圖如下:

array_unshift
int arrat_unshift ( array &$array , mixed $value1 [ , mixed $... ] )

array_unshift函數(shù)將數(shù)據(jù)元素插入到數(shù)組的頭部,插入時(shí)是作為整體插入,因此后面的參數(shù)將保持同樣的順序。插入后所有的數(shù)值鍵名將修改為從零開始計(jì)數(shù),所有的文字鍵名不變。

運(yùn)行示例
$arr = array(1, 2, 3);
array_unshift($arr, 4, 5, 6); // 4 5 6 1 2 3
運(yùn)行步驟

1、調(diào)用php_splice將數(shù)據(jù)元素插入到數(shù)組頭部,用新的哈希表替換就得哈希表并將其銷毀

2、如果操作后的stack等于運(yùn)行時(shí)的符號(hào)表,則重置哈希表的內(nèi)部指針

3、stack指向新的哈希表,釋放新的哈希表紅箭,銷毀就得哈希表

源碼解讀

由上面的步驟可知,array_unshift的核心步驟是php_splice函數(shù)。對(duì)于array_unshift函數(shù),php_splice實(shí)現(xiàn)時(shí)新建一個(gè)哈希表out_hash,將需要插入的list數(shù)據(jù)先插入到out_hash中,然后再把原來的數(shù)組數(shù)據(jù)寫入到out_hash中,這樣實(shí)現(xiàn)在數(shù)組前面插入數(shù)據(jù)元素的功能。

實(shí)現(xiàn)的效果圖如下:

小結(jié)

要理解array_push函數(shù)的執(zhí)行過程主要理解棧的思想即可,而array_unshift則是新建一個(gè)數(shù)組,然后將兩數(shù)組合并為結(jié)果數(shù)組。
這次閱讀源碼過程中,同時(shí)也研究了PHP中的哈希表數(shù)據(jù)結(jié)構(gòu)及一些API,也給自己補(bǔ)充了一些哈希表的知識(shí)。學(xué)習(xí)到了PHP底層是使用雙向鏈表做哈希沖突的處理,獲益匪淺。日后再做關(guān)于PHP數(shù)據(jù)結(jié)構(gòu)的分享。

原創(chuàng)文章,文筆有限,才疏學(xué)淺,文中若有不正之處,萬望告知。

如果本文對(duì)你有幫助,點(diǎn)收藏的同時(shí)也請(qǐng)點(diǎn)下推薦吧,謝謝^_^

我在github有對(duì)PHP源碼更詳細(xì)的注解。感興趣的可以圍觀一下,給個(gè)star。PHP5.4源碼注解。可以通過commit記錄查看已添加的注解。

更多源碼文章,歡迎訪問個(gè)人主頁繼續(xù)查看:hoohack

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/21620.html

相關(guān)文章

  • PHP 學(xué)習(xí)總結(jié)之?dāng)?shù)組

    摘要:概述我們知道,在編程語言中,數(shù)組的使用頻率是很高的,幾乎每個(gè)腳本都會(huì)使用到。循環(huán)缺點(diǎn)遍歷完成之后,不能對(duì)數(shù)組進(jìn)行第二次遍歷數(shù)組內(nèi)部指針指向了最后一個(gè)元素。 概述 我們知道,在 PHP 編程語言中,數(shù)組的使用頻率是很高的,幾乎每個(gè)腳本都會(huì)使用到。 PHP 自帶了大量的、優(yōu)秀的操作數(shù)組的函數(shù)以供我們使用,本文就對(duì)這些數(shù)組函數(shù)的使用做一些分類和總結(jié),方便大家以后查閱。 創(chuàng)建 1. range...

    wangdai 評(píng)論0 收藏0
  • PHP: array數(shù)組常用API

    摘要:語法數(shù)組刪除數(shù)組的最后一項(xiàng)語法數(shù)組在數(shù)組的最末添加一項(xiàng)語法數(shù)組刪除數(shù)組的首項(xiàng)語法數(shù)組在數(shù)組的首部添加一項(xiàng)案例分析 1:數(shù)組的指針操作: 語法:current(數(shù)組) 當(dāng)前指針指向的單元值(默認(rèn)是第零個(gè))語法 next(數(shù)組) 當(dāng)前指針往下移動(dòng)一幀語法 prev(數(shù)組) 當(dāng)前指針往前移動(dòng)一個(gè)指針語法 end(array) 將當(dāng)前指針移動(dòng)到最后一項(xiàng)語法 ...

    Cheriselalala 評(píng)論0 收藏0
  • PHP數(shù)組操作詳解

    摘要:像其他變量一樣,使用運(yùn)算符可以改變數(shù)組元素的內(nèi)容。數(shù)組的基本操作定義數(shù)組在中聲明數(shù)組的方式主要有兩種用函數(shù)聲明數(shù)組,直接為數(shù)組元素賦值。 概述 要訪問一個(gè)變量的內(nèi)容,可以直接使用其名稱。如果該變量是一個(gè)數(shù)組,可以使用變量名稱和關(guān)鍵字或索引的組合來訪問其內(nèi)容。 像其他變量一樣,使用運(yùn)算符=可以改變數(shù)組元素的內(nèi)容。數(shù)組單元可以通過 array[key] 語法來訪問。 showImg(...

    Guakin_Huang 評(píng)論0 收藏0
  • 100 個(gè)最常用的 PHP 函數(shù)

    摘要:下面的列表是最常用的前個(gè)函數(shù)它們是最常用的中自帶的函數(shù)。這些函數(shù)被命名使用,并從到進(jìn)行排序。排行函數(shù)頻率平均值前分析最常用的函數(shù)是字符串函數(shù),然后是數(shù)組函數(shù),接著是文件函數(shù)。以上個(gè)函數(shù)沒有近期要廢棄的計(jì)劃。是最常用的加密函數(shù),其次是。 showImg(https://segmentfault.com/img/remote/1460000018674936?w=600&h=293); 下...

    novo 評(píng)論0 收藏0
  • PHP面試之四:邏輯與算法

    摘要:數(shù)據(jù)結(jié)構(gòu)常見數(shù)據(jù)結(jié)構(gòu)數(shù)組是最簡單而且應(yīng)用最廣泛的數(shù)據(jù)結(jié)構(gòu)特征使用連續(xù)內(nèi)存空間來存儲(chǔ)存放相同類型或著衍生類型的元素?cái)?shù)組比較特別,可以存放八種數(shù)據(jù)類型通過下標(biāo)來訪問集合特征保存不重復(fù)的元素字典特征就是關(guān)聯(lián)數(shù)組,以形式存儲(chǔ)棧,與隊(duì)列相似特征存儲(chǔ)數(shù) 數(shù)據(jù)結(jié)構(gòu) 常見數(shù)據(jù)結(jié)構(gòu) Array 數(shù)組是 最簡單 而且 應(yīng)用最廣泛 的數(shù)據(jù)結(jié)構(gòu) 特征: 1、使用連續(xù)內(nèi)存空間來存儲(chǔ) 2、存放相同類型或著衍生類型...

    smartlion 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

HackerShell

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<