Все перестановки в двумерном массиве — уникальные и упорядоченные значения

У меня есть 2d массив. Предполагая каждую позицию, у меня есть несколько кандидатов, чтобы заполнить ее.

Пример:

Position 0 -> Candidates: 1,2,3
Position 1 -> Candidates: 3,4,5
Position 2 -> Candidates: 4,5

Идет перевод:

Array_Position(
array('1', '2', '3'),
array('3', '4','5'),
array('4', '5')
);

Я хочу все комбинации, с 2 ограничениями:

  1. Нет повторений (если кандидат уже находится в одной позиции, он не может появиться снова в другой позиции).

    Этого не может быть:

    1-4-4

    3-3-4

  2. Кандидат не может быть «меньше», чем его предыдущий.

    Этого не может быть:

    1-5-4

    3-5-4

В этом конкретном случае все возможные комбинации будут:

1-3-4

1-3-5

1-4-5
2-3-4
2-3-5

2-4-5

3-4-5

Я видел несколько ответов, как это:

<?php
function array_cartesian() {
$_ = func_get_args();
if(count($_) == 0)
return array(array());
$a = array_shift($_);
$c = call_user_func_array(__FUNCTION__, $_);
$r = array();
foreach($a as $v)
foreach($c as $p)
$r[] = array_merge(array($v), $p);
return $r;
}

$cross = array_cartesian(
array('1', '2', '3'),
array('3', '4','5'),
array('4', '5')
);

print_r($cross);

?>

но ни один из них не разрешает 2 ограничения.

Любая помощь?

Tks!

0

Решение

Поскольку любой кандидат не может быть меньше своего предыдущего, то ни одна позиция не может повторяться в цепочке. Следующий код помогает, проверьте, работает ли он у вас.

<?php

function permute()
{
$result = array();

if (func_num_args() == 0)
return $result; // empty array

foreach (func_get_arg(0) as $value)
nextPermute($result, $value, $value, 1, func_get_args());

return $result;
}

function nextPermute(&$result_array, $permute_value,
$last_value, $next_arg, $all_args)
{
if ($next_arg < count($all_args))
{
foreach ($all_args[$next_arg] as $value)
if ($value > $last_value)
nextPermute($result_array, $permute_value . '-' . $value, $value, $next_arg + 1, $all_args);
}
else
array_push($result_array, $permute_value);
}

$cross = permute(
array('1', '2', '3'),
array('3', '4', '5'),
array('4', '5')
);

print_r($cross);

?>
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector