【问题标题】:Get all possible pairs of n elements without duplicates with PHP使用 PHP 获取所有可能的 n 元素对而不重复
【发布时间】:2016-09-02 19:15:21
【问题描述】:

我需要什么

我需要所有可能的 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)。

与这个问题类似,但使用数组键:Get all the combinations of N elements of multidimensional array

【问题讨论】:

    标签: php arrays


    【解决方案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】:

    如果我正确理解了任务,这段代码应该可以工作:

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

    【讨论】:

    • 谢谢我的朋友,但钥匙不见了。 @BeetleJuice 是正确的 :)
    【解决方案3】:

    这是其他两个答案的“混合”:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2011-04-02
      相关资源
      最近更新 更多