У меня есть массив, который может содержать любое количество элементов. Каждый элемент содержит идентификатор и массив под названием «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 );
Я хотел бы создать другой массив, основанный на этом. Каждый ключ – это поле идентификатора + значение массива «параметр», а значение – это массив следующего элемента, а затем следующий и т. Д. В основном это должно дать мне любую комбинацию вышеперечисленных массивов (вроде дерева) в том порядке, в котором был определен массив:
$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') ) );
Поскольку массив может содержать любое количество элементов, я предполагаю, что мне нужно будет включить некоторый тип рекурсивной функции. У меня нет большого опыта в рекурсии, поэтому для меня это довольно сложная задача.
Могу ли я получить некоторые указания о том, с чего начать в создании этой рекурсивной функции?
Как это ? Конечно, там есть ошибка, но она идет в правильном направлении ….
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; }
Я не могу предоставить 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']}}