2014-11-08 117 views
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代码还包含所需的输出。 输出数组应该包含:

  • 单级阵列
  • 在“合并的下一个输入数组”,即树状直通。在两个输入阵列之间的合并期间应该进行每个可能的子阵列的交叉组合
  • 每个组合的密钥应该被生成为与对应的contextid元素(用一个加号粘合)的连接字符串, &符号(&); e.g:context1+id1&context2+id2
  • 对于下一个合并先前得到的数组应,以便用于例如从上方变得 context1+id1&context2+id2&context3+id3
  • 所得viewupdate元件由合并过程中简单地乘以它们相应的值来计算。
$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时可能?

我可能已经相当模糊(这真的很难解释!)表达自己,但希望它当你在引擎收录代码看一看变得更加清晰......

任何帮助将不胜感激!

+0

你永远不会有超过将3个数组输入到$ global数组中? – Maxime 2014-11-08 20:39:19

+0

您使用哪种算法在输出数组中获取该索引(如'aa + 1&cc + 3&ff + 6')? – 2014-11-08 20:41:08

+0

@Maxime $ global中输入数组的数量是变化的 – Propaganistas 2014-11-08 20:46:39

回答

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

完成。我对你的答案做了一些小的修改,以进一步推广它。 – Propaganistas 2014-11-09 10:26:14

+0

谢谢!确实,使用全局变量非常难看:) – Maxime 2014-11-09 10:27:43

+0

另一个审查正在进行中;而不是'$ globalArray [0]'我建议使用'reset($ globalArray)'概括用例。 – Propaganistas 2014-11-09 10:37:27