gpt4 book ai didi

php - 如何(快速)发现两个数组是否至少有一个共同项

转载 作者:行者123 更新时间:2023-12-02 17:37:43 24 4
gpt4 key购买 nike

我正在编写一个脚本,该脚本将重复搜索一大组数组 (40,000) 并合并所有至少具有一个共同元素的数组。我试过 array_intersect(),但我发现它对于这个应用程序来说太慢了。如果至少有一个元素在两个数组之间共享,是否有另一个函数更快并且简单地返回 true ?

我的假设是 array_intersect() 会因为两个数组都被完全审查并且公共(public)值组合在一起并返回而变慢。当找到单个匹配项时退出会更快。

澄清一下:所有数组都保存在另一个主数组(这是一个二维数组)。如果发现存储在 $master[231] 和 $master[353] 的数组都包含元素 124352354,则它们应合并到一个新数组中,并将结果存储在另一个旨在存储合并结果的二维数组中。

当前代码:

$test = array_intersect($entry, $entry2);
if($test){

...

}

更好的方法是:

foreach($entry as $item){
if(in_array($item, $entry2)){
$test = true;
break;
}
}
if($test){

...

}

另一个改进是使用 isset() 和 array_flip() 代替 in_array();

$flipped = array_flip($entry2);
foreach($entry as $item){
if(isset($flipped[$item]){
$test = true;
break;
}
}
if($test){

...

}

最佳答案

假设您只想发现两个数组是否有共同元素,您可以创建自己的 getIntersect 函数,该函数比使用 array_intersect 更快,因为它会在第一次匹配时立即返回。

function getIntersect($arr1, $arr2)
{
foreach($arr1 as $val1)
{
foreach($arr2 as $val2)
{
if($val1 == $val2)
{ return true; }
}
}
return false;
}

假设您真正要查找的是一个元素至少出现多次的数组

那么你就可以轻松拥有

function hasCommonElements($arr)
{
for($i = 0; $i < count($arr); $i++)
{
$val = $arr[$i];
unset($arr[$i]);
if(in_array($val, $arr))
{
return true;
}
}
}

并且您可以使用 array_filter 轻松获得包含公共(public)元素的所有数组的数组:

array_filter($my40k, "hasCommonElements");

假设您真正想要做的是找到至少有一个共同值的所有数组,您必须做一个更高级别 数组过滤器。

$mybigarray;//your big array

function hasIntersects($arr)
{
for($i = 0; $i < count($mybigarray); $i++)
{
if(getIntersect($arr, $mybigarray[$i]))
{
return true;
}
}
}

然后调用我们的过滤器怪物

array_filter($mybigarray, "hasIntersects");

免责声明:这些东西都没有经过测试。检查拼写错误

关于php - 如何(快速)发现两个数组是否至少有一个共同项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24790707/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com