PHP函式原始碼之array merge分析

2021-07-23 13:30:08 字數 2166 閱讀 8155

在使用array_merge時是需要注意鍵的型別的,對於string 的key  和 數字key的處理方式是有區別的,雖然應用沒問題, 但是偶爾寫的時候總有點對預期結果不踏實,所以我們還是從底層來分析下,這樣在用時候也就底氣十足了

php_function(array_merge)

注意傳入的引數,

recursive=0, replace=0

( 不遞迴merge,數字索引不替換 )

for (i = 0; i < argc; i++) else

} }array_init_size(return_value, init_size);

for (i = 0; i < argc; i++) else if (recursive && i > 0) else

} efree(args);

}這裡進入php_array_merge  根據傳入的引數 recursive=0 省略多餘分支,基本流程可歸結為

switch (zend_hash_get_current_key_ex(src, &string_key, &string_key_len, &num_key, 0, &pos))
上述**表明:

對於字串索引,會

更新字串索引的值,其結果就是引數靠後陣列的值會

覆蓋靠前的陣列的值。

而對於數字型索引,php執行的

zend_hash_next_index_insert

操作,也就是插入乙個新的元素,這同時也更改了鍵(例如原來的key=2, array_merge之後,可能變成了0)。

這樣我們在理解下面的指令碼時就沒什麼疑問了

$array1  = array( 'key'=>'one_key_a', 10  =>  'zero_a' ,  2  =>  'two_a' ,  3  =>  'three_a' );

$array2 = array( 'key'=>'one_key_b', 1 => 'one_b' , 3 => 'three_b' , 4 => 'four_b' );

var_dump(array_merge($array1, $array2), ($array1 + $array2), $array1, $array2);

結果:

array (size=7)

'key' => string 'one_key_b' (length=9)

0 => string 'zero_a' (length=6)

1 => string 'two_a' (length=5)

2 => string 'three_a' (length=7)

3 => string 'one_b' (length=5)

4 => string 'three_b' (length=7)

5 => string 'four_b' (length=6)

array (size=6)

'key' => string 'one_key_a' (length=9)

10 => string 'zero_a' (length=6)

2 => string 'two_a' (length=5)

3 => string 'three_a' (length=7)

1 => string 'one_b' (length=5)

4 => string 'four_b' (length=6)

array (size=4)

'key' => string 'one_key_a' (length=9)

10 => string 'zero_a' (length=6)

2 => string 'two_a' (length=5)

3 => string 'three_a' (length=7)

array (size=4)

'key' => string 'one_key_b' (length=9)

1 => string 'one_b' (length=5)

3 => string 'three_b' (length=7)

4 => string 'four_b' (length=6)

PHP原始碼閱讀 count函式

在php程式設計中,在遍歷陣列的時候經常需要先計算陣列的長度作為迴圈結束的判斷條件,而在php裡面對陣列的操作是很頻繁的,因此count也算是乙個常用函式,下面研究一下count函式的具體實現。我在github上有對php原始碼更詳細的註解。感興趣的可以圍觀一下,給個star。php5.4原始碼註解...

php原始碼探索四 php擴充套件原始碼分析

1 最重要的entry 比如exif裡的 zend module entry exif module entry struct zend module entry 引數 描述 size,zend api,zend debug and zts 通常使用standard module header來填充...

php 原始碼結構

目錄結構 1.build 和編譯有關的目錄。2.ext 擴充套件庫 例如 mysql zlib iconv 等我們熟悉的擴充套件庫。3.main 主目錄。4.sapi 和各種伺服器的介面呼叫,例如apache iis等,也包含一般的fastcgi cgi等。5.win32 和 windows 下編譯...