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

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

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

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

php arrays
4个回答
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,我们可以在此过程中删除对。


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;
}

0
投票

你可以像这样遍历每个数组

foreach ($a as $aItem){
    if(!in_array($aItem, $b)){
        $arr1[] = $aItem;
    }
}
var_dump($arr1);

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

© www.soinside.com 2019 - 2024. All rights reserved.