Поиск декартовых произведений с ассоциативными массивами PHP

Скажем, у меня есть такой массив:

Array
(
    [arm] => Array
        (
            [0] => A
            [1] => B
            [2] => C
        )
    [gender] => Array
        (
            [0] => Female
            [1] => Male
        )
    [location] => Array
        (
            [0] => Vancouver
            [1] => Calgary
        )
)

Как мне найти декартово произведение, сохранив ключи внешнего ассоциативного массива и используя их во внутренних? Результатом алгоритма должно быть следующее:

Array
(
    [0] => Array
        (
            [arm] => A
            [gender] => Female
            [location] => Vancouver
        )

    [1] => Array
        (
            [arm] => A
            [gender] => Female
            [location] => Calgary
        )

    [2] => Array
        (
            [arm] => A
            [gender] => Male
            [location] => Vancouver
        )

...etc.

Я просмотрел довольно много алгоритмов декартового произведения но я зацикливаюсь на деталях того, как сохранить ассоциативные ключи. Текущий алгоритм, который я использую, дает только числовые индексы:

    $result = array();
    foreach ($map as $a) {
        if (empty($result)) {
            $result = $a;
            continue;
        }
        $res = array();
        foreach ($result as $r) {
            foreach ($a as $v) {
                $res[] = array_merge((array)$r, (array)$v);
            }
        }
        $result = $res;
    }

    print_r($result);

Любая помощь приветствуется.

48
задан Lotus Notes 10 June 2011 в 09:35
поделиться