跟大家講解下有關colesafearray 深思 PHP 數組遍歷的差異(array_diff 的實現),相信小伙伴們對這個話題應該也很關注吧,現在就為小伙伴們說說colesafearray 深思 PHP 數組遍歷的差異(array_diff 的實現),小編也收集到了有關colesafearray 深思 PHP 數組遍歷的差異(array_diff 的實現)的相關資料,希望大家看到了會喜歡。
function array_diff($array_1, $array_2) { $diff = array(); foreach ($array_1 as $k => $v1) { $flag = false; foreach ($array_2 as $v2) { if ($flag = ($v1 == $v2)) { break; } } if (!$flag) { $diff[$k] = $v1; } } return $diff; }雖然實現是可以的,但是發現這個函數的效率是慘不忍睹。于是我又重新考慮了下,并優化了算法,第二個函數看起來是這個樣子的: function array_diff($array_1, $array_2) { foreach ($array_1 as $key => $item) { if (in_array($item, $array_2, true)) { unset($array_1[$key]); } } return $array_1; }嗯,這次幾乎可以和原 array_diff 函數的速度媲美了。但是還有沒有更優化的辦法呢?由 ChinaUnix 上的一篇文章(不好意思,作弊了),我發現 PHP 竟然可以這樣寫: function array_diff($array_1, $array_2) { $array_2 = array_flip($array_2); foreach ($array_1 as $key => $item) { if (isset($array_2[$item])) { unset($array_1[$key]); } } return $array_1; }這個函數的效率非常的驚人,甚至比原 array_diff 函數的速度都要快。究其原因,我找到了解釋: 因為鍵是進行 HASH 組織的,查找很快; 而 Value 只是由 Key 組織存放,本身沒有索引,每次查找都是遍歷。總結 這雖然是 PHP 語言的一個小竅門,但在遍歷和對比數組的值上,如果需要對比值將其與鍵反轉的確比通常的值對值的比較效率要高得多。 比如,上面的函數二需要調用 in_array 函數需要循環判斷是否在函數內;而函數三則僅僅判斷這個數組是否存在該鍵就可以了。加上數組鍵和值不同的組織索引方式,效率比想象的還高那就非常可以理解了。 附代碼復制代碼 代碼如下:
$v1) { $flag = false; foreach ($array_2 as $v2) { if ($flag = ($v1 == $v2)) { break; } } if (!$flag) { $diff[$k] = $v1; } } return $diff; } function array_diff3($array_1, $array_2) { foreach ($array_1 as $key => $item) { if (in_array($item, $array_2, true)) { unset($array_1[$key]); } } return $array_1; } function array_diff4($array_1, $array_2) { $array_2 = array_flip($array_2); foreach ($array_1 as $key => $item) { if (isset($array_2[$item])) { unset($array_1[$key]); } } return $array_1; } ////////////////////////////// for($i = 0, $ary_1 = array(); $i < 5000; $i++) { $ary_1[] = rand(100, 999); } for($i = 0, $ary_2 = array(); $i
以上就介紹了colesafearray 深思 PHP 數組遍歷的差異(array_diff 的實現),包括了colesafearray方面的內容,希望對PHP教程有興趣的朋友有所幫助。
來源:php中文網