Php 如何从两个数组中删除重复对?
我有两个这样的阵列:Php 如何从两个数组中删除重复对?,php,arrays,algorithm,Php,Arrays,Algorithm,我有两个这样的阵列: $arr = Array (1, 2, 3 ,4 ,5, 6 ,7 ,8 ) ; 这是: $arr2 = Array (7, 6, 5,8 ,3 ,2 ,1, 4 ) 这些数组的对是具有相同密钥的数字($arr[0]-$arr2[0]ecc) 正如你所看到的,有一些重复对,比如1-7和7-1,2-6和6-2,3-5和5-3,4-8和8-4 我需要一个函数,它接收这两个数组,并用每个数组对返回一个数组 例如,函数应返回以下内容: Array ( [0] => 1
$arr = Array (1, 2, 3 ,4 ,5, 6 ,7 ,8 ) ;
这是:
$arr2 = Array (7, 6, 5,8 ,3 ,2 ,1, 4 )
这些数组的对是具有相同密钥的数字($arr[0]-$arr2[0]ecc)
正如你所看到的,有一些重复对,比如1-7和7-1,2-6和6-2,3-5和5-3,4-8和8-4
我需要一个函数,它接收这两个数组,并用每个数组对返回一个数组
例如,函数应返回以下内容:
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
我已使此函数无法正常工作:
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;
}
你在想什么?我认为最深处的if是错误的:
if($x1 != $y2 && $x2 !=$y1){
$ok = 1;
}
else{
$ok=0;
}
$ok
每次迭代都会被覆盖$ok
将始终具有值,就好像您刚刚忽略了循环并设置了$j=count($arr2)-1
这不可能是正确的
可能还有其他问题
我还注意到,您的数据结构是不确定的。有几件事:
- 看起来很容易意外地一个接一个地取出一个阵列,这会使每对阵列错放。您可能希望切换到
和$arr[i][0]
。这样,就不可能不小心弄错了$arr[i][1]
- 如果顺序在你的配对中无关紧要,那么保持p的不变量是非常有用的₀ ≤ P₁. 例如,如果您这样做了,则通过排序来删除重复项非常容易(而且效率更高)
- 根据您的性能要求和给定的p₀ ≤ P₁ 不变量,您可以将每一对存储为字符串
“p₀,P₁"代码>。然后标准(甚至内置)排序和独特功能将顺利运行
$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;
}
另一种方式:
$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);
$arr1=数组(1,2,3,4,5,6,7,8);
$arr2=数组(7,6,5,8,3,2,1,4);
函数concat(&$item,$key,$arr)
{
$item2=$arr[$key];
如果($item<$item2)
$item.=“-”$item2;
其他的
$item=$item2.“-”$item;
}
阵列步行($arr1,$concat',$arr2);
印刷费($arr1);
$arr=数组\唯一($arr1);
印刷费($arr);
试试这个:
$arr1 = array (1, 2, 3 ,4 ,5, 6 ,7 ,8 ) ;
$arr2 = array (7, 6, 5,8 ,3 ,2 ,1, 4 ) ;
$arr3 = array();
$pairs = array();
for($i =0;$i<count($arr1);$i++)
{
$pair1 = $arr1[$i].'-'.$arr2[$i];
$pair2 = $arr2[$i].'-'.$arr1[$i];
if(!isset($pairs[$pair1]) && !isset($pairs[$pair2]))
{
$arr3[] = $arr1[$i];
$arr3[] = $arr2[$i];
$pairs[$pair1] = true;
}
}
$arr1=数组(1,2,3,4,5,6,7,8);
$arr2=数组(7,6,5,8,3,2,1,4);
$arr3=数组();
$pairs=array();
对于($i=0;$ioo方法:
class Pair {
private $x;
private $y;
public function __construct($a, $b) {
$this->x = ($a > $b ? $a : $b);
$this->y = ($a > $b ? $b : $a);
}
public function __toString() {
return "{$this->x}, {$this->y}";
}
public static function uniquePairs($arr1, $arr2) {
$pairs = array();
foreach(array_combine($arr1, $arr2) as $key => $val) {
$pair = new Pair($key, $val);
$pairs[(string)$pair] = $pair;
}
return $pairs;
}
}
// usage:
var_dump(Pair::uniquePairs(array(1,2,3,4,5,6,7,8), array(7,6,5,8,3,2,1,4)));
$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);
$arr1 = array (1, 2, 3 ,4 ,5, 6 ,7 ,8 ) ;
$arr2 = array (7, 6, 5,8 ,3 ,2 ,1, 4 ) ;
$arr3 = array();
$pairs = array();
for($i =0;$i<count($arr1);$i++)
{
$pair1 = $arr1[$i].'-'.$arr2[$i];
$pair2 = $arr2[$i].'-'.$arr1[$i];
if(!isset($pairs[$pair1]) && !isset($pairs[$pair2]))
{
$arr3[] = $arr1[$i];
$arr3[] = $arr2[$i];
$pairs[$pair1] = true;
}
}
class Pair {
private $x;
private $y;
public function __construct($a, $b) {
$this->x = ($a > $b ? $a : $b);
$this->y = ($a > $b ? $b : $a);
}
public function __toString() {
return "{$this->x}, {$this->y}";
}
public static function uniquePairs($arr1, $arr2) {
$pairs = array();
foreach(array_combine($arr1, $arr2) as $key => $val) {
$pair = new Pair($key, $val);
$pairs[(string)$pair] = $pair;
}
return $pairs;
}
}
// usage:
var_dump(Pair::uniquePairs(array(1,2,3,4,5,6,7,8), array(7,6,5,8,3,2,1,4)));