取消/删除形成一对PHP的数组元素

时间:2017-12-18 22:33:57

标签: php arrays

有两个数组,下面说数据 -
$ 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)

我怎样才能做到这一点? 感谢。

4 个答案:

答案 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)。所以选择简单或速度。