如何高效的遍歷數(shù)組?
[打印本頁(yè)]
作者: courage121
時(shí)間: 2007-5-19 22:22
標(biāo)題: 如何高效的遍歷數(shù)組?
現(xiàn)有一個(gè)數(shù)組$A存有30000多條記錄,數(shù)組$B存有10000多條記錄,如何高效的判斷數(shù)組$B中的每一元素是否在數(shù)組$A中,如果通過(guò)循環(huán)+in_array($B[i],$A)判斷,還要將max_execution_time=240 才能保證頁(yè)面不會(huì)停止運(yùn)行。請(qǐng)問(wèn)高人有沒(méi)有更好的方法進(jìn)行遍歷數(shù)組?
還有,php的in_array是如何遍歷數(shù)組的?是通過(guò)二叉樹還是hash表,還是按照順序一個(gè)一個(gè)的遍歷呀?
作者: 4號(hào)HEROIN
時(shí)間: 2007-5-19 23:13
PHP有array_diff這個(gè)函數(shù),可以實(shí)現(xiàn),搞出兩個(gè)數(shù)組的差集
但是不太清楚效率怎么樣。
ps:感覺(jué)應(yīng)該是通過(guò)HASH吧
[
本帖最后由 4號(hào)HEROIN 于 2007-5-19 23:18 編輯 ]
作者: courage121
時(shí)間: 2007-5-19 23:18
標(biāo)題: 回復(fù) 2樓 4號(hào)HEROIN 的帖子
如果in_array是通過(guò)hash進(jìn)行遍歷的,還有沒(méi)有更快的辦法實(shí)現(xiàn)判斷$B是否在$A中了?
作者: HonestQiao
時(shí)間: 2007-5-19 23:42
把其中一個(gè)數(shù)組反轉(zhuǎn)key與value互換,然后看看
作者: courage121
時(shí)間: 2007-5-20 00:02
標(biāo)題: 回復(fù) 4樓 HonestQiao 的帖子
版主,能說(shuō)明一下反轉(zhuǎn)key與value目的是什么嗎?
作者: hightman
時(shí)間: 2007-5-20 10:26
很顯然應(yīng)該把數(shù)組B的值轉(zhuǎn)換成鍵.因?yàn)殒I是進(jìn)行HASH組織的,查找很快,而VALUE只是由KEY組織存放,本身沒(méi)有索引,每次查找都是遍歷.
$C = array_flip($B);
foreach ($A as $a) { .... if (isset($C[$a])) ... }
作者: wildlily980
時(shí)間: 2007-5-20 14:18
反轉(zhuǎn)數(shù)組會(huì)不會(huì)很費(fèi)時(shí)間呢?
作者: HonestQiao
時(shí)間: 2007-5-20 14:41
原帖由 wildlily980 于 2007-5-20 14:18 發(fā)表
反轉(zhuǎn)數(shù)組會(huì)不會(huì)很費(fèi)時(shí)間呢?
反轉(zhuǎn)也就循環(huán)一次。
作者: php店小二
時(shí)間: 2007-5-21 10:20
學(xué)習(xí)了!謝謝
作者: mokai
時(shí)間: 2007-6-8 17:46
array_diff
計(jì)算數(shù)組的差集 (PHP 4 >= 4.0.1, PHP 5)
array array_diff ( array array1, array array2 [, array ...] )
說(shuō)明
array_diff() 返回一個(gè)數(shù)組,該數(shù)組包括了所有在 array1 中但是不在任何其它參數(shù)數(shù)組中的值。注意鍵名保留不變。
例 219. array_diff() 例子
copy to clipboard
<?php
$array1 = array("a" => "green", "red", "blue", "red");
$array2 = array("b" => "green", "yellow", "red");
$result = array_diff($array1, $array2);
print_r($result);
?>
在 $array1 中多次出現(xiàn)的值一樣處理,輸出結(jié)果為:
copy to clipboard
Array
(
[1] => blue
)
注意:
兩個(gè)單元僅在 (string) $elem1 === (string) $elem2 時(shí)被認(rèn)為是相同的。也就是說(shuō),當(dāng)字符串的表達(dá)是一樣的時(shí)候。
注意:
注意本函數(shù)只檢查了多維數(shù)組中的一維。當(dāng)然可以用 array_diff($array1[0], $array2[0]); 檢查更深的維度。
警告:
本函數(shù)在 PHP 4.0.4 中是壞的!
參見(jiàn) array_diff_assoc(),array_intersect() 和 array_intersect_assoc()。
作者: yueliangdao0608
時(shí)間: 2007-6-9 09:45
強(qiáng)烈關(guān)注.
作者: polymorph
時(shí)間: 2007-6-9 17:56
是否可以考慮一下先排序呢
作者: courage121
時(shí)間: 2007-6-9 20:02
剛才將兩個(gè)大小為25000數(shù)組用函數(shù)array_diff()進(jìn)行了測(cè)試一下,用時(shí)也很短,但是根據(jù)我的程序的需求,感覺(jué)還是如下的方法比較適合我
原帖由 hightman 于 2007-5-20 10:26 發(fā)表
很顯然應(yīng)該把數(shù)組B的值轉(zhuǎn)換成鍵.因?yàn)殒I是進(jìn)行HASH組織的,查找很快,而VALUE只是由KEY組織存放,本身沒(méi)有索引,每次查找都是遍歷.
$C = array_flip($B);
foreach ($A as $a) { .... if (isset ...
作者: eye_onme
時(shí)間: 2007-6-10 12:02
原帖由 hightman 于 2007-5-20 10:26 發(fā)表
很顯然應(yīng)該把數(shù)組B的值轉(zhuǎn)換成鍵.因?yàn)殒I是進(jìn)行HASH組織的,查找很快,而VALUE只是由KEY組織存放,本身沒(méi)有索引,每次查找都是遍歷.
$C = array_flip($B);
foreach ($A as $a) { .... if (isset ...
這個(gè)方法不錯(cuò)
作者: liuguanyu
時(shí)間: 2007-6-11 16:28
恩,而且還可以把重復(fù)元素剔除
作者: jtql420
時(shí)間: 2007-6-12 15:35
mark mark