2016-09-02 3 views
2

Что мне нужно

Мне нужны все возможные пары из n элементов без дубликатов. Скажем, я имею эти массивы:Получите все возможные пары n элементов без дубликатов с PHP

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

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

Что теперь мне нужно:

$pairs = [ 
    'ab' => [$arr1, $arr2], 
    'ac' => [$arr1, $arr3], 
    'bc' => [$arr2, $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; 
} 

И тогда :

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

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

$pairs = getPairs($merged); 

Есть две проблемы с моим подходом:

  1. Цикл производит $x = 0, $i = 1 и позже $i = 1, $x = 0, что приводит и дублированный массив.
  2. Я не получаю ключи (ab, ac, cb) с этим.

похож на этот вопрос, но с ключами массива: Get all the combinations of N elements of multidimensional array

ответ

1

Чтобы избежать дубликатов, гарантировать, что один член пары всегда имеет «нижний» ключ. Это позволит избежать попадания пар ac и ca.

Чтобы получить нужные ключи, используйте 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

«всегда гарантирует, что один член пары всегда имеет« нижний »ключ». Это был недостающий кусок. Большое спасибо, ты потрясающий! – 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

Вот "гибрид" из двух других ответов:

$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); 
Смежные вопросы