有两个数组,下面说数据 -
$ a =数组(a,b,d,c,e,a);
$ b =数组(a,a,d,e,c,a);
我想删除一对数组值的实例,即它应该存在于数组' a'和数组' b' 如果您了解,我想删除形成类似对的元素。
输出最终应该像 -
$a = [b]; $b = [a];
因为这些是唯一没有成对的元素。
我尝试使用array_diff,但它没有让我获得预期的输出 -
$arr1 = array_diff($aArr, $bArr);
$arr2 = array_diff($bArr, $aArr);
print_r($arr1);
print "<br>";
print_r($arr2);
$res = count($arr1) + count($arr2);
print $res;
当输入为
时,此代码工作正常
数组(c,d,e)
数组(a,b,c)
但输入为零时输入为零
数组(a,a,b,d,e,c,a)
数组(b,a,b,d,e,c,a)
我怎样才能做到这一点? 感谢。
答案 0 :(得分:3)
您可以使用array_filter
并通过引用传递:
$a = ['a', 'b', 'd', 'c', 'e', 'a'];
$b = ['a', 'a', 'd', 'e', 'c', 'a'];
$a = array_filter($a, function ($element) use (&$b) {
if (($key = array_search($element, $b)) !== false) {
unset($b[$key]);
return false;
}
return true;
});
这是demo。
使用array_filter
,我们可以根据谓词函数过滤数组(对于元素返回true的函数,应保留在结果中,否则返回false)。在我们的示例中,此函数使用$b
来确定是否保留$a
元素。如果我们通过引用在$b
条款中,我们可以在此过程中删除对。
答案 1 :(得分:0)
这适用于不同大小的数组并忽略值位置。
$arr1 = removePairs($aArr, $bArr);
$arr2 = removePairs($bArr, $aArr);
print_r($arr1);
print "<br>";
print_r($arr2);
$res = count($arr1) + count($arr2);
print $res;
function removePairs($a, $b)
{
$r = array();
foreach ($a as $index => $value) {
$found = array_search($value, $b);
if ($found !== false) {
$b[$found] .= '-';
} else {
$r[] = $value;
}
}
return $r;
}
答案 2 :(得分:0)
你可以像这样循环遍历每个数组
foreach ($a as $aItem){
if(!in_array($aItem, $b)){
$arr1[] = $aItem;
}
}
var_dump($arr1);
答案 3 :(得分:0)
我知道这是回答的。但是接受的答案比我更复杂的解决方案要慢(如果顺序无关紧要)。
$a = ['a', 'b', 'd', 'c', 'e', 'a'];
$b = ['a', 'a', 'd', 'e', 'c', 'a'];
$ha = $hb = [];
foreach ($a as $v) $ha[$v]++;
foreach ($b as $v) $hb[$v]++;
foreach (range('a', 'z') as $l) {
if (empty($ha[$l])) continue;
if (empty($hb[$l])) continue;
if ($ha[$l] > $hb[$l]) {
$ha[$l] = $ha[$l] - $hb[$l];
unset($hb[$l]);
continue;
}
$hb[$l] = $hb[$l] - $ha[$l];
unset($ha[$l]);
}
$a = [];
$b = [];
foreach ($ha as $l => $n) $a = array_merge($a, array_fill(0, $n, $l));
foreach ($hb as $l => $n) $b = array_merge($b, array_fill(0, $n, $l));
var_dump([$a, $b]);
上面的代码是O(N),因为接受的答案是O(N ^ 2)。所以选择简单或速度。