Я обволакиваю голову на пару дней...
У меня есть несколько массивов, которые должны быть объединены в один массив. Порядок, в котором они сливаются, имеет большое значение и представляет собой просто порядок, в котором они отображаются в глобальном массиве (например, пример ниже):
$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...
Любая помощь будет принята с благодарностью!
Здесь минимальный рабочий код, чтобы вы могли получить общую идею (если вы хотите улучшить код, не стесняйтесь, там многое предстоит сделать!):
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);