我需要所有可能的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);
我的方法存在两个问题:
$x = 0
,$i = 1
和更晚$i = 1
,$x = 0
,结果和重复的数组。ab
,ac
,cb
)。与此问题类似,但使用数组键:Get all the combinations of N elements of multidimensional array
答案 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”键。这样可以避免成对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;
}
答案 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);