Php 是否有一种功能性的方法来计算有多少个数组与至少一个其他数组相交?

Php 是否有一种功能性的方法来计算有多少个数组与至少一个其他数组相交?,php,arrays,Php,Arrays,假设以下数组: [ [ 'value_1', 'value_2', 'value_3', ], [ 'value_1', 'value_4', 'value_5' ], [ 'value_6', 'value_7', 'value_8' ] ] 我想计算有多少个数组与至少一个其他数组相交。在上面的例子中,我希望最终得到结

假设以下数组:

[
    [
        'value_1',
        'value_2',
        'value_3',
    ], [
        'value_1',
        'value_4',
        'value_5'
    ], [
        'value_6',
        'value_7',
        'value_8'
    ]
]
我想计算有多少个数组与至少一个其他数组相交。在上面的例子中,我希望最终得到结果
2
,因为第一个和第二个数组彼此相交。上面是一个非常简单的数组;我正在使用的阵列要大得多

我可以很容易地用一对嵌套循环和一个临时的保持数组来实现这一点,然后我对数组进行计数,但我希望有一种更优雅、更实用的方法来实现这一点

我已经查看了PHP数组函数列表,并尝试了不同的
array\u intersect
迭代,但我觉得这不是解决问题的正确方法-
array\u intersect
查找所有数组的公共交点,而不是任何数组

那么:有没有我不知道的PHP方法、现有方法的标志或多个方法之间的交互?或者我唯一的选择是明显更丑陋的循环系列?

您可以使用array\u unique()


并使用array_count_values()计算两个数组的值之间的差异。

您可以轻松地在所有数组中循环

$intersections = 0;
foreach($arrays in $k=>$arr){
    //Dont start at 0 here, it would repeat some checks.
    for($i=$k+1;$i<count($arrays);$i++){
        if(count(array_intersect($arr,$arrays[$i]))>0){
            $intersections++;
            break;
        }
    }
}
$crossions=0;
foreach($k=>$arr中的数组){
//这里不要从0开始,它会重复一些检查。
对于($i=$k+1;$i0){
$crossions++;
打破
}
}
}
编辑以获取更多信息:


正如您所暗示的,我们使用array_intersect来查看两个数组是否具有相似的值,计算返回的值的数量以查看它们是否共享任何值。如果他们这样做了,我们就加上计数,然后退出循环,因为我们想计算有多少个数组,而不是多少次。

没有循环和函数编程,没有简单的解决方案,但您可以构建一些东西

$array = [
    [
        'value_1',
        'value_2',
        'value_3',
    ], [
        'value_1',
        'value_4',
        'value_5'
    ], [
        'value_6',
        'value_7',
        'value_8'
    ]
];

$sum = array();
array_walk_recursive($array, function($item) use (&$sum){
    $sum[$item] = isset($sum[$item]) ?  $sum[$item] + 1 : 1;
});
$filter = array_filter($sum, function($item) {
    return $item > 1;
});

$result = array_filter($array, function($a) use ($filter) {
    return count(array_intersect_key(array_flip($a), $filter)) == 0;
});

print_r($result);
此解决方案背后的主要思想是创建一个项目黑名单,该黑名单不应出现在内部数组中。在您的情况下,
value_1
occours两次,因此是黑名单项目

此黑名单稍后用于交叉口。如果交叉点为空,则内部项为“唯一”,否则不为空


对于具有小“黑名单”的大型阵列,这可能比简单的嵌套循环更快,因为其主要复杂性是O(n)中的线性。

阵列中只有一个项目需要相交?数组中的位置重要吗?正确-只有一个项目需要与任何其他数组中的一个项目相交。位置不重要,只有价值。我知道,我在问题中说过,我知道我可以很容易地循环-正如我所说的,我希望有一种更实用(见:不那么难看)的方法。然后没有。。。将其包装到函数中应该是您想要/需要的。它并不难看,也不能变得更“实用”。我认为这不管用。这是针对单个关联数组的。我们谈论的是一系列的数组。我觉得这是信息量最大、写得最好的答案,谢谢!