这是我的第一个问题:)
我有一个包含许多数组子节点的数组,每个子节点都有唯一的值,并希望获得这些值的所有可能的唯一组合.
阵列的数量是已知的,但可能会随时间而变化.
例如,
array(
[0] => array([0]=>'blue',[1]=>'red'),
[1] => array([0]=>'sunny',[1]=>'cloudy'),
[2] => array([0]=>'sweet',[1]=>'acid');
Run Code Online (Sandbox Code Playgroud)
我该怎么办才能得到:
array(
[0] => array([0]=>'blue',[1]=>'sunny',[2]=>'sweet'),
[1] => array([0]=>'blue',[1]=>'sunny',[2]=>'acid'),
[2] => array([0]=>'blue',[1]=>'cloudy',[2]=>'sweet'),
[3] => array([0]=>'blue',[1]=>'cloudy',[2]=>'acid'),
[4] => array([0]=>'red',[1]=>'sunny',[2]=>'sweet'),
[5] => array([0]=>'red',[1]=>'sunny',[2]=>'acid'),
[6] => array([0]=>'red',[1]=>'cloudy',[2]=>'sweet'),
[7] => array([0]=>'red',[1]=>'cloudy',[2]=>'acid'));
Run Code Online (Sandbox Code Playgroud)
我已尝试使用嵌套循环,但我的逻辑不是太强.
非常感谢,如果有人可以解决一些问题
(注意:需要稍微修改才能在PHP <5.3中使用)
这样做(在线翻译的例子):
$f = function () { return func_get_args(); };
$res = array_outer($f,
array("blue", "red"),
array("sunny", "cloudy"),
array("sweet", "acid"));
Run Code Online (Sandbox Code Playgroud)
该功能array_outer受Mathematica的启发Outer,是:
/**
* A generalization of the outer product, forming all the possible
* combinations of the elements of any number of arrays and feeding
* them to $f.
* The keys are disregarded
**/
function array_outer($f, array $array1) {
$res = array();
$arrays = func_get_args();
array_shift($arrays);
foreach ($arrays as $a) {
if (empty($a))
return $res;
}
$num_arrays = count($arrays);
$pos = array_fill(0, $num_arrays, 0);
while (true) {
$cur = array();
for ($i = 0; $i < $num_arrays; $i++) {
$cur[] = $arrays[$i][$pos[$i]];
}
$res[] = call_user_func_array($f, $cur);
for ($i = $num_arrays-1; $i >= 0; $i--) {
if ($pos[$i] < count($arrays[$i]) - 1) {
$pos[$i]++;
break;
} else {
if ($i == 0)
break 2;
$pos[$i] = 0;
}
}
}
return $res;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
563 次 |
| 最近记录: |