我有一个可以包含任意数量元素的数组。每个元素都包含一个ID和一个名为“options”的数组(也包含任意数量的元素)。结构如下:
$arr = array(
array('id' => 10, 'options' => array(3, 5)),
array('id' => 15, 'options' => array(2, 4, 8, 9)),
array('id' => 20, 'options' => array(2, 6, 7)),
// ... any number of elements
);
我想基于这个创建另一个数组。每个键都是ID字段+'选项'数组值,值是下一个元素的数组,然后是下一个元素,依此类推。基本上它应该按照定义数组的顺序给我上面的数组的每个组合(有点像树):
$new = array(
'10-3' => array(
'15-2' => array('20-2', '20-6', '20-7'),
'15-4' => array('20-2', '20-6', '20-7'),
'15-8' => array('20-2', '20-6', '20-7'),
'15-9' => array('20-2', '20-6', '20-7')
),
'10-5' => array(
'15-2' => array('20-2', '20-6', '20-7'),
'15-4' => array('20-2', '20-6', '20-7'),
'15-8' => array('20-2', '20-6', '20-7'),
'15-9' => array('20-2', '20-6', '20-7')
)
);
因为数组可以包含任意数量的元素,所以我假设我需要包含某种类型的递归函数。我没有太多的递归经验,所以对我来说这是一项非常艰巨的任务。
我是否可以获得一些关于从何处开始构建此递归函数的指示?
答案 0 :(得分:1)
function possibilities ($input) {
$output=array();
$current = array_shift($input);
foreach ($current as #key=>$value) {
if empty($input) {
$output[] = $key.'-'.$value;
} else {
$output[$key.'-'.$value] = possibilities($input);
}
}
return $output;
}
答案 1 :(得分:0)
我不能提供一个PHP,而是一个Python:
arr = [ (10, [3,5]),
(15, [2,4,8,9]),
(20, [2,6,7]) ]
def combine_options(pair):
id, options = pair
res = []
for i in options:
res.append("%d-%d" % (id, i))
return res
def combine(arr, i):
res = {}
if i == len(arr)-1:
return combine_options(arr[i])
for elem in combine_options(arr[i]):
res[elem] = combine(arr, i+1)
return res
import pprint
pprint.pprint(combine(arr,0))
这给出了
{'10-3': {'15-2': ['20-2', '20-6', '20-7'],
'15-4': ['20-2', '20-6', '20-7'],
'15-8': ['20-2', '20-6', '20-7'],
'15-9': ['20-2', '20-6', '20-7']},
'10-5': {'15-2': ['20-2', '20-6', '20-7'],
'15-4': ['20-2', '20-6', '20-7'],
'15-8': ['20-2', '20-6', '20-7'],
'15-9': ['20-2', '20-6', '20-7']}}