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