Я пытаюсь получить все возможности из дерева решений в PHP, мой ввод выглядит так:
array(
(int) 61 => array(
(int) 257 => '62'
),
(int) 62 => array(
(int) 258 => '63',
(int) 259 => '63',
(int) 260 => '64',
(int) 261 => null
),
(int) 63 => array(
(int) 262 => '65',
(int) 263 => '65',
(int) 264 => '66',
(int) 265 => '69'
),
(int) 64 => array(
(int) 266 => '65',
(int) 267 => '66',
(int) 268 => '66',
(int) 269 => null
),
...
Если задано нулевое значение, путь завершен.
Ключ первого уровня — это идентификатор сцены, второй уровень — идентификатор выбора в качестве ключа и идентификатор следующей сцены в качестве значения.
Я не могу понять, как справиться с этой проблемой, я попробовал рекурсивную функцию, как это:
function myRecursive($dialogs) {
foreach($dialogs as $i => $scene_to_go) {
if(empty($scene_to_go)) {
$index++;
} else {
$result[$index][] = $scene_to_go;
myRecursive($scenesArray[$scene_to_go]);
}
}
}
myRecursive($scenesArray[61]);
Но это работает только для первой возможности, я думаю, что я близок к решению?
Проблема заключается в конечном условии, и как избежать дубликатов.
Большое спасибо за Вашу помощь.
РЕДАКТИРОВАТЬ : Ожидаемый массив результатов должен выглядеть так:
[
[61, 62, 63, 65],
[61, 62, 64, 65],
...
]
<?php
public function getNextScenes($sceneId, &$nextDialogsArray) {
global $array;
foreach($array[$sceneId] as $dialogId => $nextSceneId) {
$nextDialogsArray[$dialogId] = [];
if (!empty($nextSceneId)) {
$this->getNextScenes($nextSceneId, $nextDialogsArray[$dialogId]);
}
}
}
global $array;
$array = [/**/]; // The input array you mentionned up there
$finalArray = [];
$this->getNextScenes(61, $finalArray);
?>
Если вы сгладить $finalArray
то есть у вас есть уникальные возможности в ключах массива.
Других решений пока нет …