PHP 2D Массив производят все комбинации

У меня была эта проблема при изгибе моего ума некоторое время теперь (насморк не помогает также!), в основном у меня есть массив 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

Но я хотел бы за это смочь работать с как можно большим количеством различных массивов.

19
задан PhearOfRayne 4 December 2013 в 22:45
поделиться

2 ответа

это называется «декартово произведение», справочная страница 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);
20
ответ дан 30 November 2019 в 03:59
поделиться

Я думаю, это работает - хотя после написания я понял, что он очень похож на то, что предлагали другие, но он дает вам массив в запрошенном формате. Извините за плохое именование переменных.

$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;   
            }
        }
    }
}
1
ответ дан 30 November 2019 в 03:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: