我有两个数组:
$array1 = [
[['host' => 'test1']],
[['host' => 'test2']],
];
$array2 = [
'test1',
'ghfhfghfg',
];
现在我想比较这些数组并返回
$nCount = 1
,因为 test1
存在于两个表中。
你可以这样做:
count(array_intersect(array_map(function($a) { return $a[0]['host']; }, $array1), $array2));
首先你必须知道你的输入是什么。在您的情况下,我假设您将始终拥有相同类型的多列“表”(如您所说)。
对于这种情况,您可以使用类似以下内容的方法,将多列数组展平为第二个平面数组。
<?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
并不总是具有相同的深度,则需要递归地展平。如果它总是具有相同的深度(您总是知道数组是如何构建的),您可以使用上面的代码。
如果可以的话,我倾向于避免硬编码数组索引。
你的第一个数组结构总是相同的吗?
我会编写一个函数来展平第一个数组,例如:
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
功能添加更多检查。
在检查交叉点之前没有必要进行循环数据准备。只需使用
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)
)
);