计算 3d 数组和平面数组之间的值相交的数量

问题描述 投票:0回答:4

我有两个数组:

$array1 = [
    [['host' => 'test1']],
    [['host' => 'test2']],
];

$array2 = [
    'test1',
    'ghfhfghfg',
];

现在我想比较这些数组并返回

$nCount = 1
,因为
test1
存在于两个表中。

php arrays multidimensional-array intersection counting
4个回答
1
投票

你可以这样做:

count(array_intersect(array_map(function($a) { return $a[0]['host']; }, $array1), $array2));

0
投票

首先你必须知道你的输入是什么。在您的情况下,我假设您将始终拥有相同类型的多列“表”(如您所说)。

对于这种情况,您可以使用类似以下内容的方法,将多列数组展平为第二个平面数组。

<?php
$multi_col = array(
    array(
        array(
            'host'=>'test1'
        )
    ),
    array(
        array(
            'host'=>'test2'
        )
    )
);

$single_col = array('test1', 'sfsd');
$single_cold_multicol = array_map(function(Array $item){
    return $item[0]['host'];
}, $multi_col);

$diff_compare = array_diff($single_col, $single_cold_multicol);
$nCount = count($single_col) - count($diff_compare);

如果您的

$multi_col
并不总是具有相同的深度,则需要递归地展平。如果它总是具有相同的深度(您总是知道数组是如何构建的),您可以使用上面的代码。


0
投票

如果可以的话,我倾向于避免硬编码数组索引。

你的第一个数组结构总是相同的吗?

我会编写一个函数来展平第一个数组,例如:

    function flatten($arr, &$acc=array()) {
        if (empty($arr)) {
            return $acc;
        }   
        $e = array_pop($arr);
        if (is_array($e)) {
            flatten($e, $acc);
        } else {
            $acc[] = $e;
        }
        return flatten($arr, $acc);
    }

这种展平方法适用于第一个数组的更一般情况。 调用会是这样的:

    $ar = array(
        array(
            'test1',
        ),
        array(
            'test2',
        ),
     );

     $ar2 = array(
         'test1',
         'ghfhfghfg',
     );

     $same = array_intersect(flatten($ar), $ar2);
     var_dump($same);

您可以为

flatten
功能添加更多检查。


0
投票

在检查交叉点之前没有必要进行循环数据准备。只需使用

array_uintersect()
并在三向比较运算符的任一侧尝试访问一个数组中的值,否则回退到另一个数组的值。 演示

echo count(
         array_uintersect(
             $array1,
             $array2,
             fn($a, $b) => ($a[0]['host'] ?? $a)
                 <=> ($b[0]['host'] ?? $b)
         )
     );
// 1

或者,在过滤时拨打

in_array()
演示

echo count(
         array_filter(
             $array1,
             fn($set) => in_array($set[0]['host'], $array2)
         )
     );
© www.soinside.com 2019 - 2024. All rights reserved.