首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何删除两个数组中的重复对?

如何删除两个数组中的重复对?
EN

Stack Overflow用户
提问于 2011-10-26 21:05:24
回答 5查看 396关注 0票数 4

我有两个这样的数组:

代码语言:javascript
运行
复制
$arr = Array (1, 2, 3 ,4 ,5, 6 ,7 ,8 ) ;

还有这个:

代码语言:javascript
运行
复制
$arr2 = Array (7, 6, 5,8 ,3 ,2 ,1, 4 )  

这些数组的对是具有相同密钥($arr-$arr2ECC)的数字。

代码语言:javascript
运行
复制
1-7
2-6
3-5
4-8
5-3
6-2
7-1
8-4

如你所见,有一些重复的对,比如1-7和7-1,2-6和6-2,3-5和5-3,4-8和8-4。

我需要一个函数接收这两个数组,并返回一个数组,每个数组对。

例如,该函数应返回以下内容:

代码语言:javascript
运行
复制
Array ( [0] => 1 [1] => 7 [2] => 2 [3] => 6 [4] => 3 [5] => 5 [6] => 4 [7] => 8 ) 

如你所见,这些对是: 1-7,2-6,3-5和4-8。

我创建了一个不能正常工作的函数:

代码语言:javascript
运行
复制
function free_pairs($arr,$arr2){
$ok = 0;
$ris = array();
$indice_ris=0;
for ($i=1; $i <=count($arr) ; $i++) { 
    $x1 = $arr[$i];
    $x2 = $arr2[$i];
    for ($j=1; $j <= count($arr2) ; $j++) { 
        $y1 = $arr[$j];
        $y2 = $arr2[$j];
        if($x1 != $y2 && $x2 != $y1){
            $ok = 1;
        } else {
            $ok = 0;
        }
    }
    if ($ok == 1) {
        $ris[$indice_ris] = $x1;
        $ris[$indice_ris+1] = $x2;
        $indice_ris = $indice_ris+2;
        $ok = 0;
    }
    return $ris;
}

我认为问题出在这里,如果:

代码语言:javascript
运行
复制
if($x1 != $y2 && $x2 !=$y1)

你在想什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-10-26 21:33:27

在对原始脚本进行了一些更正之后,这似乎是可行的:

代码语言:javascript
运行
复制
$arr1 = Array (1, 2, 3, 4 ,5, 6 ,7 ,8);
$arr2 = Array (7, 6, 5, 8 ,3 ,2 ,1, 4);
$res = free_pairs($arr1, $arr2);
print_r($res);

function free_pairs($arr,$arr2){
    $ris = array();
    for ($i = 0; $i < count($arr); $i++) { 
        $x1 = $arr[$i];
        $x2 = $arr2[$i];
        $ok = 0;
        for ($j = $i+1; $j < count($arr2); $j++) { 
            $y1 = $arr[$j];
            $y2 = $arr2[$j];
            if($x1 == $y2 && $x2 == $y1){
                $ok = 1;
            }
        }
        if ($ok == 0) {
            $ris[] = $x1;
            $ris[] = $x2;
        }
    }
    return $ris;
}

输出:

代码语言:javascript
运行
复制
Array
(
    [0] => 5
    [1] => 3
    [2] => 6
    [3] => 2
    [4] => 7
    [5] => 1
    [6] => 8
    [7] => 4
)
票数 1
EN

Stack Overflow用户

发布于 2011-10-26 21:15:51

我认为最里面的if是错的:

代码语言:javascript
运行
复制
        if($x1 != $y2 && $x2 !=$y1){
            $ok = 1;
        }
        else{
            $ok=0;
        }

$ok在每次迭代中都会被覆盖;$ok将始终具有该值,就像您刚刚省略了循环并设置了$j=count($arr2)-1一样,这不可能是正确的。

可能还有其他问题..。

我还注意到你的数据结构有问题。有几件事:

  • 看起来很容易意外地将一个数组分成一个数组,这就是每对数组的错误配对。您可能希望切换到$arr[i][0]$arr[i][1]作为配对。这样,就不可能意外地错配对了。
  • 如果你们的配对顺序不重要,那么保持p₀≤p₁的不变性是非常有用的。如果您这样做了,例如,通过sorting.
  • Depending根据您的性能需求删除重复项非常容易(也更有效),并给出一个p₀≤p₁不变量,您可以将每一对都存储为一个字符串字符串。然后,标准的(甚至是内置的)排序和唯一函数将毫不费力地工作。
票数 0
EN

Stack Overflow用户

发布于 2011-10-26 21:48:58

另一种方式:

代码语言:javascript
运行
复制
$arr1 = array(1, 2, 3, 4, 5, 6, 7, 8);
$arr2 = array(7, 6, 5, 8, 3, 2, 1, 4);

function concat(&$item, $key, $arr)
{
    $item2 = $arr[$key];
    if($item < $item2)
        $item .= "-" . $item2;
    else
        $item = $item2 . "-" . $item;
}

array_walk($arr1, 'concat', $arr2);
print_r($arr1);

$arr = array_unique($arr1);
print_r($arr);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7902996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档