PHP - 通过每个数组组合循环一次

时间:2017-12-13 12:16:30

标签: php arrays

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

我有一个一维数组,我想在每个组合之间循环,每个组合只有一次。

我正在寻找类似的东西:

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

我正在寻找恰好2个元素之间的组合,并排除与元素本身的组合。

由于我多次重复使用此行为,我想找到一种干净的方法来实现它。

手动编码行为会更好吗?

2 个答案:

答案 0 :(得分:2)

这样的东西?

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

答案 1 :(得分:0)

也许

function fooFunction(array $array){
    while (!empty($array)) {
        $first = array_shift($array);
        $remainder = $array;
        while (!empty($remainder)) {
            yield implode('-', [$first, array_shift($remainder)]);
        }
    }
}