使用PHP

时间:2016-09-02 19:15:21

标签: php arrays

我需要什么

我需要所有可能的n个元素对,没有重复。假设我有这些数组:

$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. 我没有得到密钥(abaccb)。
  3. 与此问题类似,但使用数组键:Get all the combinations of N elements of multidimensional array

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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

答案 2 :(得分: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);