PHP的array_diff()函數(shù)在處理大數(shù)組時(shí)的效率問(wèn)題
更新時(shí)間:2011年11月27日 23:15:31 作者:
PHP 5.2.6 以上版本的 array_diff() 函數(shù)在處理大數(shù)組時(shí),需要花費(fèi)超長(zhǎng)時(shí)間,這個(gè) bug 已經(jīng)被官方確認(rèn);在這個(gè)問(wèn)題被修復(fù)之前或者在我們不能控制 PHP 版本的時(shí)候,可以使用本文提供的方法
cisa 提交到 PHP 官方 BUG 頁(yè)面上的方法
<?php
/**
* 解決 php 5.2.6 以上版本 array_diff() 函數(shù)在處理
* 大數(shù)組時(shí)的需要花費(fèi)超長(zhǎng)時(shí)間的問(wèn)題
*
* 整理:http://www.CodeBit.cn
* 來(lái)源:http://bugs.php.net/47643
*/
function array_diff_fast($data1, $data2) {
$data1 = array_flip($data1);
$data2 = array_flip($data2);
foreach($data2 as $hash => $key) {
if (isset($data1[$hash])) unset($data1[$hash]);
}
return array_flip($data1);
}
?>
根據(jù) ChinaUnix 論壇版主 hightman 思路重寫(xiě)的方法
<?php
/**
* 解決 php 5.2.6 以上版本 array_diff() 函數(shù)在處理大數(shù)組時(shí)的效率問(wèn)題
* 根據(jù) ChinaUnix 論壇版主 hightman 思路寫(xiě)的方法
*
* 整理:http://www.CodeBit.cn
* 參考:http://bbs.chinaunix.net/viewthread.php?tid=938096&rpid=6817036&ordertype=0&page=1#pid6817036
*/
function array_diff_fast($firstArray, $secondArray) {
// 轉(zhuǎn)換第二個(gè)數(shù)組的鍵值關(guān)系
$secondArray = array_flip($secondArray);
// 循環(huán)第一個(gè)數(shù)組
foreach($firstArray as $key => $value) {
// 如果第二個(gè)數(shù)組中存在第一個(gè)數(shù)組的值
if (isset($secondArray[$value])) {
// 移除第一個(gè)數(shù)組中對(duì)應(yīng)的元素
unset($firstArray[$key]);
}
}
return $firstArray;
}
?>
此方法只交換了第二個(gè)數(shù)組的 key 和 value,所以效率更高。
注意:PHP 內(nèi)置的 array_diff() 函數(shù)可以處理多個(gè)數(shù)組,而本文提供的方法只處理了兩個(gè)數(shù)組的比較。
復(fù)制代碼 代碼如下:
<?php
/**
* 解決 php 5.2.6 以上版本 array_diff() 函數(shù)在處理
* 大數(shù)組時(shí)的需要花費(fèi)超長(zhǎng)時(shí)間的問(wèn)題
*
* 整理:http://www.CodeBit.cn
* 來(lái)源:http://bugs.php.net/47643
*/
function array_diff_fast($data1, $data2) {
$data1 = array_flip($data1);
$data2 = array_flip($data2);
foreach($data2 as $hash => $key) {
if (isset($data1[$hash])) unset($data1[$hash]);
}
return array_flip($data1);
}
?>
根據(jù) ChinaUnix 論壇版主 hightman 思路重寫(xiě)的方法
復(fù)制代碼 代碼如下:
<?php
/**
* 解決 php 5.2.6 以上版本 array_diff() 函數(shù)在處理大數(shù)組時(shí)的效率問(wèn)題
* 根據(jù) ChinaUnix 論壇版主 hightman 思路寫(xiě)的方法
*
* 整理:http://www.CodeBit.cn
* 參考:http://bbs.chinaunix.net/viewthread.php?tid=938096&rpid=6817036&ordertype=0&page=1#pid6817036
*/
function array_diff_fast($firstArray, $secondArray) {
// 轉(zhuǎn)換第二個(gè)數(shù)組的鍵值關(guān)系
$secondArray = array_flip($secondArray);
// 循環(huán)第一個(gè)數(shù)組
foreach($firstArray as $key => $value) {
// 如果第二個(gè)數(shù)組中存在第一個(gè)數(shù)組的值
if (isset($secondArray[$value])) {
// 移除第一個(gè)數(shù)組中對(duì)應(yīng)的元素
unset($firstArray[$key]);
}
}
return $firstArray;
}
?>
此方法只交換了第二個(gè)數(shù)組的 key 和 value,所以效率更高。
注意:PHP 內(nèi)置的 array_diff() 函數(shù)可以處理多個(gè)數(shù)組,而本文提供的方法只處理了兩個(gè)數(shù)組的比較。
相關(guān)文章
關(guān)于PHP二進(jìn)制流 逐bit的低位在前算法(詳解)
本篇文章是對(duì)PHP二進(jìn)制流逐bit的低位在前算法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
Windows環(huán)境下安裝PHP Pear的方法圖文教程
這篇文章主要介紹了Windows環(huán)境下安裝PHP Pear的方法,結(jié)合圖文形式詳細(xì)說(shuō)明了Windows環(huán)境下安裝PHP Pear的相關(guān)命令與操作技巧,需要的朋友可以參考下2019-07-07
工廠模式在Zend Framework中應(yīng)用介紹
在Zend Framework中,使用了多種設(shè)計(jì)模式。其中對(duì)數(shù)據(jù)庫(kù)的封裝,用到了工廠模式
2012-07-07
php精確的統(tǒng)計(jì)在線人數(shù)的方法
這篇文章主要介紹了php精確的統(tǒng)計(jì)在線人數(shù)的方法,需要的朋友可以參考下
2015-10-10
zend framework配置操作數(shù)據(jù)庫(kù)實(shí)例分析
zend framework項(xiàng)目建立后,看了下zend framework配置操作數(shù)據(jù)庫(kù),本文將詳細(xì)介紹,需要了解的朋友可以參考下
2012-12-12 
