2011-10-26 127 views
4

我有兩個數組是這樣的:如何從兩個數組中刪除重複對?

$arr = Array (1, 2, 3 ,4 ,5, 6 ,7 ,8) ; 

這:

$arr2 = Array (7, 6, 5,8 ,3 ,2 ,1, 4) 

這些陣列的對是使用相同的密鑰數量($改編[0] - $ ARR2 [0 ] ECC)

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。

我需要一個函數來引用這兩個數組並返回一個數組與每個單對。

例如,這是什麼樣的功能應該回報:

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($x1 != $y2 && $x2 !=$y1) 

你認爲怎麼樣?

回答

1

您的原始腳本一些修正之後,這似乎工作:

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

輸出:

Array 
(
    [0] => 5 
    [1] => 3 
    [2] => 6 
    [3] => 2 
    [4] => 7 
    [5] => 1 
    [6] => 8 
    [7] => 4 
) 
+0

這項工作完美:d謝謝! – gaggina

+0

@ user740478:不客氣。 – Toto

0

我覺得最裏面,如果是錯誤的:

 if($x1 != $y2 && $x2 !=$y1){ 
      $ok = 1; 
     } 
     else{ 
      $ok=0; 
     } 

$ok被覆蓋每次迭代; $ok將始終具有該值,就像您剛剛省略循環並設置了$j=count($arr2)-1這不可能是正確的。

可能還有其他的問題......

我還注意到,您的數據結構是前途未卜。幾件事情:

  • 看起來像它會很容易意外地將一個陣列關閉一個,並且這對每對錯配。您可能想要切換到$arr[i][0]$arr[i][1]。這樣,它不可能不小心誤入歧途。
  • 如果訂單在您的貨幣對中無關緊要,保持p0≤p 1的不變量可能非常有用。例如,如果您這樣做了,則通過排序來移除重複項非常簡單(並且效率更高)。
  • 根據您的性能要求並給定一個p 0≤p 1不變量,您可以將每個對存儲爲一個字符串"p₀,p₁"。然後,標準(甚至內置)排序和獨特的功能將毫無困難地工作。
0

另一種方式:

$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

試試這個:

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

$arr3是您的最終數組。

0

一個面向對象的方法:

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))); 
相關問題