数组项的合并


Merging of array items

我已经问过一次这个问题,想在Python中找到一个解决方案:

dict项的python交集

但我现在正在寻找PHP中的等效解决方案。具体来说,我在ConsoleShell上使用CakePHP 2.0。

我在一个数组中有一个数量不确定的嵌套,我想像这样循环:

$array = array(1 => array(1, 2, 3, 4), 2 => array(7, 8), n => array(n1, n2, n3))
foreach($array[1] as $k1 => $v1) {
  foreach($array[2] as $k2 => $v2) {
    foreach($array[n] as $kn => $vn) {
      // do something with this combination
    }
  }
}

请记住,n可以是任何数字(嵌套的总数),所以我需要允许嵌套的动态数量的代码。

有什么想法吗?

谢谢编辑:只是为了澄清我想要什么,如果

$array = array(array(0, 1, 2, 3), array(0, 6, 7), array(0, 9, 10));

我想以结束

$array2 = array(
  array(0, 0, 0),
  array(0, 0, 9),
  array(0, 0, 10),
  array(0, 6, 0),
  array(0, 6, 9),
  ...
  array(3, 6, 10),
  array(3, 7, 0),
  array(3, 7, 9),
  array(3, 7, 10)
);

但是,如果$array有4个数组元素,那么$array2每行应该有4个元素。

function dosomething($a) {
  if (is_array($a)) 
    foreach ($a as $aa)
      dosomething($aa)
  else {
    //do something
  }
}

编辑:

OQ更新后,很明显,不是深度是可变的,而是元素计数。所以我们不需要递归,而是嵌套的foreach es

这提供OQ 中要求的输出

<?php
$array = array(array(0, 1, 2, 3), array(0, 6, 7), array(0, 9, 10));
$result=array(array());
foreach ($array as $a) {
  $oldresult=$result;
  $result=array();
  foreach ($oldresult as $or) {
    foreach($a as $aa) {
      $nr=$or;
      $nr[]=$aa;
      $result[]=$nr;
    }
  }
}
print_r($result);
?>

简而言之:我们从一个结果数组开始,它有一个元素:一个空数组。现在,我们循环遍历输入数组的第一级,在每一步中,我们都将结果数组的所有元素替换为一系列元素,这些元素由原始元素组成,并附加了当前数组的每个成员。

第一次迭代取代

array() with array(0), array(1), array(2), array(3)

第二次迭代取代

array(0) with array(0,0), array(0,6), array(0,7)
array(1) with array(1,0), array(1,6), array(1,7)
...

第三次迭代取代

array(0,0) with array(0,0,0), array(0,0,9), array(0,0,10)
array(0,1) with array(0,1,0), array(0,1,9), array(0,1,10)
...
array(1,0) with array(1,0,0), array(1,0,9), array(1,0,10)
...