合并数组项

时间:2012-01-08 18:43:32

标签: php arrays nested-loops

对于Python中的解决方案,我已经问了一次这个问题:

python intersect of dict items

但我现在正在寻找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个元素等。

1 个答案:

答案 0 :(得分:1)

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)
...