Передача нескольких массивов в декартову функцию

Мне нужно передать несколько массивов в индексированном формате в функцию cartesain, чтобы вычислить каждую перестановку. Это работает, когда код:

$count = cartesian(
Array("GH20"),
Array(1,3),
Array(6,7,8),
Array(9,10)
);

Я не всегда буду знать длину, количество массивов или значений, поэтому они хранятся в другом массиве «$ total», который может выглядеть примерно так:

Array (
[0] =>  Array
(
[0] => 1
[1] => 3
)
[1] => Array
(
[0] => 6
[1] => 7
[2] => 8
)
[2] => Array
(
[0] => 9
[1] => 10
)
)

Я попытался реализовать user_call_back_function согласно:

$count = call_user_func('cartesian', array($total));

Однако передаваемый массив выглядит так:

Array (
[0] => Array (
[0] => Array (
[0] => Array (
[0] => 1
[1] => 3
[2] => 4
)
[1] => Array (
[0] => 5
[1] => 6
[2] => 7
[3] => 8
)
[2] => Array (
[0] => 9
[1] => 10
)
)
)
)

Где я ошибаюсь, почему массив скрывается дальше в измерениях, где он не нужен, и это причина, по которой моя функция cartesain больше не работает?

Спасибо ник

Как и просили, вот моя функция cartesain:

function 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;
}

0

Решение

почему массив спрятан ниже в размерах, где он не нужен?

Просто потому, что вы оборачиваете массив в другой массив при вызове call_user_func,

$count = call_user_func('cartesian', array($total));

Возможно, вы имели в виду это:

$count = call_user_func('cartesian', $total);

это причина, почему моя функция cartesain больше не работает?

Я не знаю, вы не разместили свой cartesainАррат называется cartesain

РЕДАКТИРОВАТЬ как оп обновил вопрос.

Если вы используете PHP 5.6, вы сможете использовать оператор сплат.

call_user_func("cartesain", ...$total);

Отказ от ответственности, я не проверял это.

Массивы и объекты Traversable могут быть распакованы в списки аргументов при вызове функций с помощью оператора ….

0

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

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

По вопросам рекламы [email protected]