Слияние сложных массивов

0

Я обволакиваю голову на пару дней...

У меня есть несколько массивов, которые должны быть объединены в один массив. Порядок, в котором они сливаются, имеет большое значение и представляет собой просто порядок, в котором они отображаются в глобальном массиве (например, пример ниже):

$input1 = array(
  array(
    'context' => 'aa', 'id' => 1, 'view' => 1, 'update' => 1,
  ),
  array(
    'context' => 'bb', 'id' => 2, 'view' => 0, 'update' => 0,
  )
);
$input2 = array(
  array(
    'context' => 'cc', 'id' => 3, 'view' => 0, 'update' => 1,
  ),
  array(
    'context' => 'dd', 'id' => 4, 'view' => 0, 'update' => 0,
  ),
  array(
    'context' => 'ee', 'id' => 5, 'view' => 1, 'update' => 0,
  )
);
$input3 = array(
  array(
    'context' => 'ff', 'id' => 6, 'view' => 1, 'update' => 1,
  ),
  array(
    'context' => 'gg', 'id' => 7, 'view' => 1, 'update' => 0,
  ),
);

$global = array($input1, $input2, $input3);

Каждый входной массив состоит из нескольких подмассивов, имеющих равную структуру; см. http://pastebin.com/fQMUjUpB для примера. Этот код pastebin также включает желаемый результат. Выходной массив должен содержать:

  • массив одного уровня
  • древовидная сквозная пересылка "слияния следующего массива ввода", а именно: каждая возможная кросс-комбинация подмассивов должна выполняться во время слияния двух входных массивов
  • ключ каждой комбинации должен быть сгенерирован как конкатенированная строка соответствующего context и id элементов (склеенных плюсом), соединенных вместе с амперсандом (&); например: context1+id1&context2+id2
  • Для следующего слияния предыдущий результирующий массив должен использоваться для того, чтобы приведенный выше пример стал context1+id1&context2+id2&context3+id3
  • Полученные в результате view и update элементов вычисляются простым умножением их соответствующие значения во время слияния.
$output = array(
  'aa+1&cc+3&ff+6' => array('view' => 0, 'update' => 1),
  'aa+1&cc+3&gg+7' => array('view' => 0, 'update' => 0),
  'aa+1&dd+4&ff+6' => array('view' => 0, 'update' => 0),
  'aa+1&dd+4&gg+7' => array(...),
  'aa+1&ee+5&ff+6' => array(...),
  'aa+1&ee+5&gg+7' => array(...),
  'bb+2&cc+3&ff+6' => array(...),
  'bb+2&cc+3&gg+7' => array(...),
  'bb+2&dd+4&ff+6' => array(...),
  'bb+2&dd+4&gg+7' => array(...),
  'bb+2&ee+5&ff+6' => array(...),
  'bb+2&ee+5&gg+7' => array(...)
);

Как это можно сделать при переходе через $global?

Я, возможно, выразил себя довольно неопределенно (это очень трудно объяснить!), Но, надеюсь, становится более ясным, когда вы смотрите на код pastebin...

Любая помощь будет принята с благодарностью!

Теги:
arrays

1 ответ

2
Лучший ответ

Здесь минимальный рабочий код, чтобы вы могли получить общую идею (если вы хотите улучшить код, не стесняйтесь, там многое предстоит сделать!):

function generate_output($globalArray, $context = array(), $view = 1, $update = 1, &$output = array()) {
    if(!count($globalArray)) {
        $output[implode('&', $context)] = array('view' => $view, 'update' => $update);
    }
    else {
        foreach(reset($globalArray) as $elt) {
            $newContext = $context;
            $newContext[] = $elt['context'] . '+' . $elt['id'];
            generate_output(array_slice($globalArray, 1), $newContext, $view * $elt['view'], $update * $elt['update'], $output);
        }
    }
    return $output;
}

generate_output($global);
  • 0
    Готово. Я внес небольшие изменения в ваш ответ, чтобы обобщить его еще больше.
  • 0
    Спасибо! Действительно, использование глобальной переменной очень уродливо :)
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню