PHP漲姿勢 記錄曾經遇到的乙個陣列合併的坑

2021-09-12 21:42:26 字數 1826 閱讀 7624

一說到陣列合併相比你馬上就會想到乙個函式array_merge

對,今天就是說說這個函式造成的乙個奇葩bug

合併乙個或多個陣列

array_merge()將乙個或多個陣列的單元合併起來,乙個陣列中的值附加在前乙個陣列的後面。返回作為結果的陣列。

如果輸入的陣列中有相同的字串鍵名,則該鍵名後面的值將覆蓋前乙個值。然而,如果陣列包含數字鍵名,後面的值將不會覆蓋原來的值,而是附加到後面。

如果只給了乙個陣列並且該陣列是數字索引的,則鍵名會以連續方式重新索引。

不多廢話,直接上**;

$array1=[

'12093'

=>

['name'

=>

'calss_name']]

;$array2=[

'12393'

=>

['name'

=>

'some thing else']]

;$new

=array_merge

($array1

,$array2);

var_dump

($new);

/*array(2)

[1]=>

array(1)

}*/

看結果沒什麼不正常,兩個陣列的確是合到了一起,而且看上去過得很幸福;

但是實際開發中情況是這樣的。原始陣列的 鍵值 是乙個重要資訊,後續的邏輯還要用到這個值;但是合併後原來的值被替換成了索引陣列。後邊出來的資料總是異常,而且寫**的大神也一直沒有發現那裡不對……

再看下面的**

$array1=[

'a12093'

=>

['name'

=>

'calss_name']]

;$array2=[

'a12393'

=>

['name'

=>

'some thing else']]

;$new

=array_merge

($array1

,$array2);

var_dump

($new);

/*array(2)

["a12393"]=>

array(1)

}*/

這次好像沒有前面的問題了……

仔細看一下文件裡的這句話

如果陣列包含數字鍵名,後面的值將不會覆蓋原來的值,而是附加到後面。

$variable

=array([

'a',

'b',

'c',

'd']

,//null);

$box

=array

('a'

,'b'

,"c");

foreach

($variable

as$key

=>

$value

)var_dump

($box);

/*array(7)

*/

這種情況下似乎一切正常;但是 突然有一天$variable**現了乙個null;結果就搞笑了…… **就不展示了,感興趣可以試一下去掉 null前面的注釋執行一下。

在使用array_merge合併兩個陣列是還要特別注意判斷被合併的變了是不是在任何情況下都是陣列

遇到的乙個php過濾問題

在測試手工注入時發現乙個比較有意思的問題 這個問題是關於php過濾器的 主要用到的 段為filter var get id filter sanitize string 如下 傳值的連線 and select count from msysobjects 0 and 1 1 con mysql co...

遇到乙個Mysql死鎖問題,記錄下

對一張表做批量編輯,表的基本介面如下 t test bigint id,int status,varchar clientid,更新語句是 update t test set status 2 where clientid 當批量操作時,批量提交多次update語句,每次語句執行是需要做以下操作 1...

記錄php中雙冒號的乙個用法

php中雙冒號的用法 不例項化類 而呼叫 類中的方法和屬性 一直以為php雙冒號只是在類呼叫靜態屬性和靜態方法的時候上用到。但是我錯了,今天我在看ecmall的一段 時發現 ecmall startup class ecmall 我才知道原來雙冒號的用法不僅僅是在呼叫靜態的時候用到。下面測試了一下 ...