问题看起来有些微不足道,但我没有找到答案:
我有一个维度的数组,我希望循环通过自身之间的每种组合,每个组合只有一次。
我正在寻找:
public function foo($array)
{
$array = [1,2,3];
$arrayCombinations = $this->arrayPermutations($array);
foreach($arrayCombinations as $combination) {
echo $combination;
}
}
public function arrayPermutations($elements)
{
$arrayPermutations = array();
foreach ($elements as $element1) {
foreach ($elements as $element2) {
if ($element1 != $element2) {
$permutationA = array($element1, $element2);
$permutationB = array($element2, $element1);
if (!in_array($permutationA, $arrayPermutations) && !in_array($permutationB, $arrayPermutations)) {
$arrayPermutations[] = $permutationA;
}
}
}
}
return $arrayPermutations;
}
将给出:
1-2
1-3
2-3
我正在寻找正好的两个元素之间的组合,并将其与元素本身的组合排除在外。
由于我要多次重复这种行为,所以我想找到一种干净的方法。
我会手动编码行为更好吗?
类似的东西?
function fooFunction($array) {
$res = array();
foreach ($array as $i => $valI) {
foreach ($array as $j => $valJ) {
if ($i < $j)
$res[] = $valI."-".$valJ;
}
}
return $res;
}
或更直接:
function fooFunction($array) {
$res = array();
$n = sizeof($array);
for ($i = 0; $i < $n; $i++)
for ($j = $i + 1; $j < $n; $j++)
$res[] = $array[$i]."-".$array[$j];
return $res;
}
最通用的形式可能是采用回调功能,然后可以做任何您想做的事情:
function fooFunction($array, $callback) {
$n = sizeof($array);
for ($i = 0; $i < $n; $i++)
for ($j = $i + 1; $j < $n; $j++)
$callback($array[$i], $array[$j]);
}
fooFunction([1, 2, 3], function($a, $b) {
echo $a."-".$b."n";
});
也许
function fooFunction(array $array){
while (!empty($array)) {
$first = array_shift($array);
$remainder = $array;
while (!empty($remainder)) {
yield implode('-', [$first, array_shift($remainder)]);
}
}
}