2016-09-02 9 views
2

私が必要とするもの

重複のないn要素の可能なすべてのペアが必要です。PHPで重複しないn要素のすべての対を取得する

$arr1 = [2, 4, 6, 7]; 
$arr2 = [6, 5, 4, 11]; 
$arr3 = [22, 1, 5, 8]; 

$final = [ 
    'a' => $arr1, 
    'b' => $arr2, 
    'c' => $arr3 
]; 

私が今必要なのである:

function getPairs($array) { 
    $n = count($array); 

    $finalArray = []; 
    $i = 0; 
    foreach ($array as $a) { 
     for ($x = $n-1; 0 <= $x; $x--) { 
      if ($i != $x) { 
       $finalArray[] = [$array[$i], $array[$x]]; 
      } 
     } 
     $i++; 
    } 

    return $finalArray; 
} 

そして:私は

が、私はこの時点まで来ました何

$pairs = [ 
    'ab' => [$arr1, $arr2], 
    'ac' => [$arr1, $arr3], 
    'bc' => [$arr2, $arr3] 
]; 

のは、私はこれらの配列をしたとしましょう:

$arr1 = [2, 4, 6, 7]; 
$arr2 = [6, 5, 4, 11]; 
$arr3 = [22, 1, 5, 8]; 

$merged = [$arr1, $arr2, $arr3]; 

$pairs = getPairs($merged); 

は私のアプローチには二つの問題があります。

ループは$x = 0$i = 1以降$i = 1、結果$x = 0、重複配列を生成
  1. これにはキーがありません(abaccb)。

似この質問へのが、配列のキーを持つ:Get all the combinations of N elements of multidimensional array

答えて

1

を、常にペアの一方のメンバーを保証"lower"キーがあります。これによりペアの取得が回避されますacca

希望する文字キーを取得するには、array_keys()を使用して元の配列からキーを抽出します。ここで

function getPairs($array) { 
    $n = count($array); 
    $keys = array_keys($array); 
    $finalArray = []; 
    $i = 0; 
    foreach ($array as $a) { 
     for ($x = $n-1; $i < $x; $x--) { 
      $key1 = $keys[$i]; 
      $key2 = $keys[$x]; 
      $finalArray[$key1.$key2] = [$array[$key1], $array[$key2]]; 
     } 
     $i++; 
    }  
    return $finalArray; 
} 

Live demo

+0

"常にペアのメンバーの1つが常に"下位の "キーを持つことを保証します。"それは欠けている部分だった。ありがとう、あなたは素晴らしいです! – Julian

1

このコードは、私がきちんと仕事理解していれば動作するはずです:重複を避けるために

$a = [[2, 4, 6, 7],[6, 5, 4, 11],[22, 1, 5, 8]]; 
$result = []; 
$n = count($a); 

for($i = 0; $i < $n-1; $i++) { 
    for($j = $i+1; $j < $n; $j++) { 
     $result[(string)$i.(string)$j] = [$a[$i], $a[$j]]; 
    } 
} 

print_r($result); 
+0

おかげで私の友人が、キーが欠落していました。 @BeetleJuiceは正しいです: – Julian

0

他の2つの答えの "ハイブリッド" である:

$arr1 = [2, 4, 6, 7]; 
$arr2 = [6, 5, 4, 11]; 
$arr3 = [22, 1, 5, 8]; 

$final = [ 
    'a' => $arr1, 
    'b' => $arr2, 
    'c' => $arr3 
]; 

$n = count($final); 
$keys = array_keys($final); 

$pairs = []; 
for($i = 0; $i < $n-1; $i++) { 
    for($j = $i+1; $j < $n; $j++) { 
     $pairs[$keys[$i] . $keys[$j]] = [$final[$keys[$i]], $final[$keys[$j]]]; 
    } 
} 

print_r($pairs); 
関連する問題