很多時候我們要把多個數(shù)組進(jìn)行合并,在php函數(shù)庫中合并函數(shù)有:
直接合并:array_merge,array_merge_recursive;
間接合并:array_map,array_filter等可以使用匿名函數(shù)的方法
還有一種合并方式,那就是 + 這個實際就是一種運算,但在很多時候它能完成直接合并不能完成的數(shù)組合并。
在這里不對間接合并作說明,因為間接數(shù)據(jù)已經(jīng)類似foreach循環(huán)處理。
array_merge_recursive 函數(shù)是針對多個數(shù)組合并但不能丟失每一個元素
array_merge 函數(shù)是針對多個數(shù)組合并只要后面有重復(fù)的就覆蓋前面的。
array_merge_recursive,array_merge這兩個函數(shù)在合并數(shù)字下標(biāo)或索引下標(biāo)時是不會覆蓋,而是重寫原標(biāo)下為默認(rèn)索引下標(biāo)按每個數(shù)組元素先后順序追加到合并新數(shù)組中去,所以當(dāng)待合并數(shù)組中需要覆蓋數(shù)字下標(biāo)的元素時這兩個函數(shù)就不能直接合并了,要么給把下標(biāo)修改成不純數(shù)字,要么使用循環(huán)語句,或者使用 +
+ 運算在處理數(shù)組時,必須保證兩邊的運算值都是數(shù)組,注意:+前面的數(shù)組會覆蓋后面數(shù)組相同鍵名的值,這個與函數(shù)調(diào)用正好相反。
例如:
$arr與$arr1是兩個混合數(shù)組,結(jié)構(gòu)相同,只是數(shù)據(jù)有些差別,通過上面不同方式合并結(jié)果完全不相同,合并后主要看點是數(shù)組中下標(biāo)為test2與123的合并結(jié)果變化。
函數(shù) array_merge 合并存在覆蓋元素,但對于索引元素只會累加而不是覆蓋,那它合并后的結(jié)果是:
結(jié)論:使用array_merge函數(shù)對數(shù)組進(jìn)行合并,系統(tǒng)只會對數(shù)組的第一層下標(biāo)進(jìn)行判斷,數(shù)字下標(biāo)的元素會全部保留,并且在不影響元素索引位置重置下標(biāo),標(biāo)下的順序是從第一個數(shù)組開始然后累加后面的數(shù)組,字符串類下標(biāo)系統(tǒng)只保留最后出現(xiàn)下標(biāo)與元素,不會遞歸到元素的內(nèi)層數(shù)組中,直接覆蓋前面的元素。
函數(shù) array_merge_recursive 合并存在覆蓋元素,但對于索引元素只會累加而不是覆蓋,那它合并后的結(jié)果是:
結(jié)論:使用array_merge_recursive對數(shù)組進(jìn)行合并,系統(tǒng)只對第一層數(shù)字下標(biāo)的元素進(jìn)行重置為索引下標(biāo)并保留原來的位置,字符串類下標(biāo)元素是不會覆蓋,而是遞歸到內(nèi)層,遞歸中有數(shù)字下標(biāo)的停止當(dāng)前元素遞歸并重置下標(biāo),下標(biāo)是以當(dāng)前遞歸層內(nèi)第一個數(shù)字下標(biāo)為起點值進(jìn)行累加,并不全從0開始累加,遞歸層內(nèi)最內(nèi)層的字符串下標(biāo)出現(xiàn)相同時,會在最小層內(nèi)創(chuàng)建一個數(shù)組并按重復(fù)的先后順序添加到這個數(shù)組中去,數(shù)組以默認(rèn)索引下標(biāo)進(jìn)行添加
使用$arr + $arr1 運算方式是不會重置下標(biāo),所以相同下標(biāo)的元素都會以+左邊的數(shù)組為主去覆蓋+右邊的元素,那運算后的結(jié)果是:
結(jié)論:使用+運算合并數(shù)組,系統(tǒng)只對運算數(shù)組的第一層元素進(jìn)行嚴(yán)格的下標(biāo)合并覆蓋,運算前面的數(shù)組會覆蓋后面所有相同下標(biāo)的元素,并且不會遞歸到內(nèi)層,所有數(shù)字下標(biāo)與字符串下標(biāo)都將進(jìn)行覆蓋操作,并且不會修改下標(biāo)。
大部分開發(fā)中都會使用函數(shù)或循環(huán)合并數(shù)組,其它很多時候使用+會更方便,總結(jié)下這三種方式的合并場景:
array_merge :應(yīng)用在只對字符串下標(biāo)覆蓋(后面出現(xiàn)的覆蓋前面出現(xiàn)的元素),數(shù)字下標(biāo)的全部累加且不關(guān)注下標(biāo)是否修改或要求重置默認(rèn)數(shù)字下標(biāo),所有的合并只在第一層元素與對應(yīng)的下標(biāo)下完成,并不遞歸到內(nèi)層元素。
array_merge_recursive :應(yīng)用在不覆蓋任何元素,相同字符串下標(biāo)的元素會遞歸到內(nèi)層并在最小合并層時創(chuàng)建一個數(shù)組將重復(fù)的元素追加到這個數(shù)組中,數(shù)字下標(biāo)的停止當(dāng)前元素遞歸合并全部累加到當(dāng)前層(如果是第一層會重置數(shù)字下標(biāo)為默認(rèn)索引下標(biāo),第二層及更深層不會修改第一個元素的下標(biāo)值,只會重置第二個及以后的所有當(dāng)層數(shù)字下標(biāo)以第一個下標(biāo)為起始下標(biāo)值累加)且不關(guān)注下標(biāo)是否修改或要求重置默認(rèn)數(shù)字下標(biāo)。
+ :應(yīng)用在嚴(yán)格按下標(biāo)(不區(qū)分下標(biāo)是否與數(shù)字或字符串)覆蓋,或者下標(biāo)不相同時累加且不重置下標(biāo)。