php-循环一次穿过每个阵列组合



问题看起来有些微不足道,但我没有找到答案:

我有一个维度的数组,我希望循环通过自身之间的每种组合,每个组合只有一次。

我正在寻找:

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)]);
        }
    }
}

最新更新