У меня была эта проблема при изгибе моего ума некоторое время теперь (насморк не помогает также!), в основном у меня есть массив PHP, который похож на этот пример:
$array[0][0] = 'apples';
$array[0][1] = 'pears';
$array[0][2] = 'oranges';
$array[1][0] = 'steve';
$array[1][1] = 'bob';
И я хотел бы смочь произвести из этого таблицу с каждой возможной комбинацией их, но не повторяя комбинаций (независимо от их положения), таким образом, например, это произведет
Array 0 Array 1
apples steve
apples bob
pears steve
pears bob
Но я хотел бы за это смочь работать с как можно большим количеством различных массивов.
это называется «декартово произведение», справочная страница php по массивам http://php.net/manual/en/ref.array. 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('apples', 'pears', 'oranges'),
array('steve', 'bob')
);
print_r($cross);
Я думаю, это работает - хотя после написания я понял, что он очень похож на то, что предлагали другие, но он дает вам массив в запрошенном формате. Извините за плохое именование переменных.
$output = array();
combinations($array, $output);
print_r($output);
function combinations ($array, & $output, $index = 0, $p = array()) {
foreach ( $array[$index] as $i => $name ) {
$copy = $p;
$copy[] = $name;
$subIndex = $index + 1;
if (isset( $array[$subIndex])) {
combinations ($array, $output, $subIndex, $copy);
} else {
foreach ($copy as $index => $name) {
if ( !isset($output[$index])) {
$output[$index] = array();
}
$output[$index][] = $name;
}
}
}
}