根据您的任务范围,可能需要仅从第一个数组中删除在第二个数组中以“一对一”方式表示的元素。在其他情况下,可能需要以“一对一”的方式交叉检查两个数组的差异,并合并剩余的元素。
考虑这个修改后的样本数据集:
$test1 = [
"blah1",
"blah1",
"blah2",
"blah4",
"blah5"
];
$test2 = [
"blah1", // under-represented
"blah2", // equally found
"blah3", // not found
"blah4", // over-represented
"blah4", // "
];
以下是四个不同的功能(带有指示性名称),以提供各种实用性。
代码:(
演示)
单边差异(迭代数组搜索):
function removeBValuesFromA(array $a, array $b): array
{
foreach ($b as $bVal) {
$k = array_search($bVal, $a);
if ($k !== false) {
unset($a[$k]);
}
}
return array_values($a);
}
双边差异(迭代数组搜索):
function bidirectionalDiff(array $a, array $b): array
{
foreach ($b as $bKey => $bVal) {
$aKey = array_search($bVal, $a);
if ($aKey !== false) {
unset($a[$aKey], $b[$bKey]);
}
}
return array_merge($a, $b);
}
单边差异(压缩-比较-展开):
function removeBValuesFromAViaCounts(array $a, array $b): array
{
$toRemove = array_count_values($b);
$result = [];
foreach (array_count_values($a) as $k => $count) {
array_push(
$result,
...array_fill(
0,
max(0, $count - ($toRemove[$k] ?? 0)),
$k
)
);
}
return $result;
}
双边差异(压缩-比较-展开):
function bidirectionalDiffViaCounts(array $a, array $b): array
{
$bCounts = array_count_values($b);
$result = [];
foreach (array_count_values($a) as $k => $count) {
array_push(
$result,
...array_fill(
0,
abs($count - ($bCounts[$k] ?? 0)),
$k
)
);
unset($bCounts[$k]);
}
foreach ($bCounts as $k => $count) {
array_push(
$result,
...array_fill(0, $count, $k)
);
}
return $result;
}
执行:
var_export([
'removeBValuesFromA' => removeBValuesFromA($test1, $test2),
'bidirectionalDiff' => bidirectionalDiff($test1, $test2),
'removeBValuesFromAViaCounts' => removeBValuesFromAViaCounts($test1, $test2),
'bidirectionalDiffViaCounts' => bidirectionalDiffViaCounts($test1, $test2),
]);
输出:
array (
'removeBValuesFromA' =>
array (
0 => 'blah1',
1 => 'blah5',
),
'bidirectionalDiff' =>
array (
0 => 'blah1',
1 => 'blah5',
2 => 'blah3',
3 => 'blah4',
),
'removeBValuesFromAViaCounts' =>
array (
0 => 'blah1',
1 => 'blah5',
),
'bidirectionalDiffViaCounts' =>
array (
0 => 'blah1',
1 => 'blah4',
2 => 'blah5',
3 => 'blah3',
),
)
$array1 = [ 'a', 'b', 'c' ]
和$array2 = [ 'd' ]
时它会失败。输出结果应该与$array1
相同,但实际上是[ 'b', 'c' ]
,因为当查找d
时array_search()
将返回false
,并且unset()
将删除$array1
中的第一个键,因为false == 0
。在此情况下,可以使用if
语句解决此问题(gist,run)。 - David Rodrigues