第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

php合并多維數(shù)組子集的一個問題

php合并多維數(shù)組子集的一個問題

回首憶惘然 2019-04-09 20:24:06
比如一個多維數(shù)組$arr=array('0'=>array('1','2'),'1'=>array('2','3'),'2'=>array('3','4'),'3'=>array('4','5'),'4'=>array('5','6'),)我要合并$arr的所有子集數(shù)組變成一個新的數(shù)組$new_arr=array('1','2','2','3','3','4','4','5','5','6');最快的方法是什么
查看完整描述

2 回答

?
慕田峪9158850

TA貢獻(xiàn)1794條經(jīng)驗 獲得超7個贊

array_walk版一號代碼:
$res=array();
array_walk($arr,function($item,$key)use(&$res){$res=array_merge($res,$item);});
array_walk_recursive版二號代碼:
$res=array();
array_walk_recursive($arr,function($item,$key)use(&$res){$res[]=$item;});
優(yōu)美的寫法需要PHP版本的支持,如果不支持的話就把匿名函數(shù)和use改成普通函數(shù)和global的形式就好了。
補充答案:
foreach循環(huán)普通版三號代碼:
$res=array();
foreach($arras$item){$res=array_merge($res,$item);}
doubleforeach嵌套循環(huán)普通版四號代碼:
見@thbourlove的答案。
既然題主強調(diào)了一下時間的話那我就認(rèn)真做一個測評好了,為了增加可比性我又寫了一個普通版用循環(huán)的第三版作為對比代碼,通過測試得到四組代碼在不同數(shù)組長度的情況下所消耗的時間的一個表:
array_walk
array_walk_recursive
foreach
doubleforeach
500
0.12
0.003
0.067
0.003
100
0.45
0.006
0.331
0.003
1500
1.7
0.005
1.523
0.003
2000
3.38
0.005
2.092
0.003
2500
6.16
0.008
4.126
0.004
3000
10.15
0.010
6.258
0.005
*注1:表格左側(cè)為數(shù)組的長度,默認(rèn)算的是一級數(shù)組,例如題目中的數(shù)組長度為5。每個二級數(shù)組的長度統(tǒng)一為題目示例中的2。
*注2:表格中的數(shù)據(jù)默認(rèn)單位為秒
*注3:本來其實測試數(shù)據(jù)為100000長度的數(shù)組的,結(jié)果array_walk花了204s,我就放棄那么長了。
*注4:doubleforeach的代碼參見@thbourlove的答案,另外此算法的運算時間由于之前三者比較的數(shù)據(jù)已經(jīng)不存在了,所以我重新找了一組規(guī)格相同的數(shù)據(jù)和第二種算法做了同期測試,并根據(jù)兩組數(shù)據(jù)之間的關(guān)系得到了表格現(xiàn)在的數(shù)據(jù)。
通過以上數(shù)據(jù)可以得出,性能方面的話還是@thbourlove的嵌套循環(huán)是最高的,不過個人是代碼美觀控,所以還是比較偏愛第二種。
通過以上數(shù)據(jù)可以得出三種方法中array_walk_recursive方法無疑是最快的。
array_walk_recursive的低版本兼容寫法我在這里補充一下:
$res=array();
functionmerge($item,$key){
global$res;
$res[]=$item
}
array_walk_recursive($arr,'merge');
至于修改后的代碼的效率測試我就不在這里多做了,相比最終得到的結(jié)果應(yīng)該也是一樣的。
                            
查看完整回答
反對 回復(fù) 2019-04-09
?
嚕嚕噠

TA貢獻(xiàn)1784條經(jīng)驗 獲得超7個贊

本來要踩一下@怡紅公子的答案的,結(jié)果發(fā)現(xiàn)自己聲望不夠,好吧,只好默默的答題了。。
其實認(rèn)真分析一下@怡紅公子答案里的那個benchmark表就看出來了,明顯1號方案和3號方案的算法復(fù)雜度是O(mn^2),而2號方案的復(fù)雜度只有O(mn)。其中,m為哈希表內(nèi)每個列表的長度,n為哈希表的長度。
是什么導(dǎo)致了這樣的差距呢?再仔細(xì)看一眼代碼,就會發(fā)現(xiàn)1號方案和3號方案同時出現(xiàn)了一個函數(shù)array_merge。這貨到底做了什么呢?
其實每次array_merge操作都會把參數(shù)里的兩個array合并,并且生成一個新的array并為其分配內(nèi)存。這個操作的復(fù)雜度為O(mn),而$res[]=$item這樣一個往array里append的復(fù)雜度只有O(1),累積起來只有O(m)。所以benchmark的結(jié)果就可以理解了。
最后大家可以試試下面這段代碼:
$res=[];
foreach($arras$item){
foreach($itemas$value){
$res[]=$item;
}
}
理論上是一定比array_walk_recursive,具體我沒怎么測,你們可以試試。
PS:array_walk系列函數(shù)(包括array_walkarray_maparray_filter……)我印象里都是比foreach要慢的,至少在php5.4.6上我實測如此。歡迎大家拍磚。
                            
查看完整回答
反對 回復(fù) 2019-04-09
  • 2 回答
  • 0 關(guān)注
  • 322 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號