我有一个$数组,我希望将每个第二级元素组合如下:
$array['A'] = array('a','b','c');
$array['B'] = array('d','e','f');
$array['C'] = array('g','h','i');
function combine($array)
{
$result = array();
foreach($array['A'] as $a)
{
foreach($array['B'] as $b)
{
foreach($array['C'] as $c)
{
$result[] = array($a,$b,$c);
}
}
}
return $result;
}
只有当count($ array)为3时,combine()才能正常显示正确的结果。如果我添加更多的$ array元素,例如$ array ['D'] = array('j',' k','l'),然后它无法正常工作。
如何解决此问题?
我想我应该使用递归函数。但我对这种类型的编程没有任何经验。
你能帮帮我吗?这让我很疯狂。答案 0 :(得分:1)
class Counter {
private $bases;
private $currNum;
private $increment;
private $maxVal;
public function __construct($bases) {
$this->bases = $bases;
$this->maxVal = 1;
$this->currNum = array();
foreach ($bases as $base) {
$this->maxVal *= $base;
$this->currNum[] = 0;
}
$this->increment = 0;
}
public function increment() {
++$this->increment;
for ($i = count($this->currNum) - 1; $i > -1; --$i) {
$val = $this->currNum[$i] + 1;
if ($val >= $this->bases[$i]) {
$this->currNum[$i] = 0;
} else {
$this->currNum[$i] = $val;
return;
}
}
}
// TODO handle overflows
public function hasNext() {
return $this->increment < $this->maxVal;
}
public function getNum() {
return $this->currNum;
}
public function getIncrement() {
return $this->increment;
}
}
// your sample arrays
$arrays = array(
array('a', 'b', 'c'),
array('d', 'e', 'f'),
array('g', 'h', 'i')
);
// parameter to counter changes based on how many arrays you have
// if you have 4 arrays of len 4, it'll be $counter = new Counter(array(4,4,4,4));
// it'll work with arrays of varying lengths as well.
// so if you have 1 array of len 2, another of len 3 and a third of len 4:
// $counter = new Counter(array(2,3,4));
$counter = new Counter(array(3,3,3));
$result = array();
while ($counter->hasNext()) {
$indexes = $counter->getNum();
//print_r($indexes);
$result[] = array();
foreach ($indexes as $arr => $index) {
$result[count($result) - 1][] = $arrays[$arr][$index];
}
$counter->increment();
}
print_r($result);
我改变了
$阵列[ 'A']
$阵列[ 'B']
被索引为
$数组[0]
$ array [1]等使其更易于使用。
counter->getNum()
返回数组索引。您可以选择是否要实际选择该元素。
答案 1 :(得分:0)
您可以使用array_map(null, $array['A'], $array['B'], $array['C'], $array['D'])
来执行此操作。
array_map可以使用null作为回调来构造数组数组。
答案 2 :(得分:0)
问题是你的函数要求它的参数是一个如下结构的数组:
Array
(
[A] => Array()
[B] => Array()
[C] => Array()
)
我认为添加另一个键'D'实际上并没有破坏功能,你只是没有得到你想要的结果。