这些问题看起来有点微不足道,但我找不到答案:
我有一个一维数组,我想在每个组合之间循环,每个组合只有一次。
我正在寻找类似的东西:
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个元素之间的组合,并排除与元素本身的组合。
由于我多次重复使用此行为,我想找到一种干净的方法来实现它。
手动编码行为会更好吗?
答案 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)]);
}
}
}