Php 找到第一个合适的元素数组

Php 找到第一个合适的元素数组,php,recursion,Php,Recursion,我有一种从另一个方法输出的树结构,格式如下: $tracks=[[1,4]、[3,5]、[2,3,5]、[1,2]、[2,4] 其中顶部节点为空数组,$tracks[0]=[1,4]组合前两个节点(要么1要么4)。这不是从$tracks[2]=[2,3,5]中看到的二叉树,这意味着有三个可能的节点 我想找到第一个数字不重复的组合(例如[1,3,5,2,4]),因此不需要遍历整个树 我创建了一个函数,但遇到了一个无法解决的问题: $availableTracks = [[1,4],[3,5],[2

我有一种从另一个方法输出的树结构,格式如下:

$tracks=[[1,4]、[3,5]、[2,3,5]、[1,2]、[2,4]

其中顶部节点为空数组,
$tracks[0]=[1,4]
组合前两个节点(要么
1
要么
4
)。这不是从
$tracks[2]=[2,3,5]
中看到的二叉树,这意味着有三个可能的节点

我想找到第一个数字不重复的组合(例如
[1,3,5,2,4]
),因此不需要遍历整个树

我创建了一个函数,但遇到了一个无法解决的问题:

$availableTracks = [[1,4],[3,5],[2,3,5],[1,2],[2,4]];
$availableTracks2 = [[1,4],[3,5],[2,3,5],[1],[2,4]];


/*
    $pairedTracks = all tracks given
    $currentPath = generated path
    $level = which level in tree
    $nodeElement = element position
    $previousnode = which node it started from in current level
*/

function findBestPath($pairedtracks,$currentPath,$level,$nodeElement,$previousNode){
    if (in_array($pairedtracks[$level][$nodeElement],$currentPath)){
        echo "[IN ARRAY]: Node element in current: ".$pairedtracks[$level][$nodeElement]." on level: ".$level;
        echo "<br>";
        echo "Node which level lowered from: ".$previousNode;
        echo "<br>";
        //Check if node element is in array
        $maxLength = count($pairedtracks[$level]);
        if ($nodeElement+1 == $maxLength){
            //Current was final, return back up
            $level -= 1;
            // Go forward from previous
            $previousNode += 1;
            // Set new start node in recursive function
            $nodeElement = $previousNode;
            if ($nodeElement == count($pairedtracks[$level])){
                //Check if node element is on the same length, then go back even more.
                /*
                    At this point i realized that i'm going to need to keep track of too many previous iterations
                */

            }
            echo "Moving back up to level: ".$level.", starting iteration from: ".$nodeElement;
            echo "<br>";
            // Remove previously added element from that level!
            array_splice($currentPath, $currentPath[count($currentPath)-1], 1);
            return findBestPath($pairedtracks,$currentPath,$level,$nodeElement,$previousNode);
        }
        else {
            //More elements to follow
            $nodeElement += 1;
            return findBestPath($pairedtracks,$currentPath,$level,$nodeElement,$previousNode);
        }

    }
    else {
        //Was not in array, element can be added to current path
        echo "Adding element to current path: ".$pairedtracks[$level][$nodeElement];
        echo "<br>";
        $currentPath[] = $pairedtracks[$level][$nodeElement];
        //Check if path has finalized or check more
        if (count($currentPath) == count($pairedtracks)){
            //Search finished
            return $currentPath;
        }
        else {
            //Move downwards
            $level += 1;
            return findBestPath($pairedtracks,$currentPath,$level,0,$nodeElement);
        }
    }


}

$path = findBestPath($availableTracks2,[],0,0,0);
foreach ($path as &$value) {
    echo $value." ";
}    
$availableTracks=[[1,4]、[3,5]、[2,3,5]、[1,2]、[2,4];
$availableTracks2=[[1,4]、[3,5]、[2,3,5]、[1]、[2,4];
/*
$pairedTracks=给定的所有轨迹
$currentPath=生成的路径
$level=树中的哪个级别
$nodeElement=元素位置
$previousnode=它从当前级别的哪个节点开始
*/
函数findBestPath($pairedtracks、$currentPath、$level、$nodeElement、$previousNode){
if(在数组中($paireTracks[$level][$nodeElement],$currentPath)){
echo“[在数组中]:当前“.$PaireTracks[$level][$nodeElement]”中的节点元素。级别:.$level;
回声“
”; echo“从以下位置降低级别的节点:.$previousNode; 回声“
”; //检查节点元素是否在数组中 $maxLength=计数($pairedtracks[$level]); 如果($nodeElement+1==$maxLength){ //当前是最终结果,返回备份 $level-=1; //上溯 $previousNode+=1; //在递归函数中设置新的开始节点 $nodeElement=$previousNode; 如果($nodeElement==count($pairedtracks[$level])){ //检查节点元素的长度是否相同,然后返回更多。 /* 此时,我意识到我需要跟踪太多以前的迭代 */ } echo“向上移动到级别:.$level.”,从:.$nodeElement开始迭代; 回声“
”; //从该级别删除以前添加的元素! 阵列拼接($currentPath,$currentPath[count($currentPath)-1],1); 返回findBestPath($pairedtracks、$currentPath、$level、$nodeElement、$previousNode); } 否则{ //要遵循的更多元素 $nodeElement+=1; 返回findBestPath($pairedtracks、$currentPath、$level、$nodeElement、$previousNode); } } 否则{ //不在数组中,元素可以添加到当前路径 echo“将元素添加到当前路径:”.$pairedtracks[$level][$nodeElement]; 回声“
”; $currentPath[]=$pairedtracks[$level][$nodeElement]; //检查路径是否已完成或检查更多 if(计数($currentPath)=计数($pairedtracks)){ //搜索完成 返回$currentPath; } 否则{ //下移 $level+=1; 返回findBestPath($pairedtracks,$currentPath,$level,0,$nodeElement); } } } $path=findBestPath($availableTracks2,[],0,0,0); foreach($path as&$value){ 回声$value.“; }

它适用于
availableTracks
,但当它必须返回多个级别时会遇到问题。我得出的结论是,我需要保留不止一个
上一个节点
,但我确信应该可以不将其保留在内存中,而只是相应地修改每个递归上的数组长度。不幸的是,我想不出一个办法来做到这一点,也许有人能帮我做到这一点?

不知道为什么我没有任何评论就被否决了,但我想我已经设法解决了这个问题:

$availableTracks = [[1,4],[3,5],[2,3,5],[1,2],[2,4]];
$availableTracks2 = [[1,4],[3,5],[2,3,5],[1],[2,4]];


function findBestPath($pairedtracks,$currentPath,$level,$nodeElement,$previousNode){
    $maxLength = count($pairedtracks[$level]);
    if ($nodeElement == $maxLength){
        echo "[Back up more]<br>";
        echo "Current pair: [";
        foreach ($pairedtracks[$level] as &$pairElement){
            echo $pairElement.",";
        }
        echo "]<br>";
        echo "Current path: [";
        foreach ($currentPath as &$pathElement){
            echo $pathElement.",";
        }
        echo "]<br>";
        //Current was final, return back up
        $level -= 1;
        $lastInserted = $currentPath[count($currentPath)-1];
        //Take index from previous level
        $indexNumber = 0;
        foreach ($pairedtracks[$level] as &$pairElement){
            echo "Pair: ".$pairElement."<br>";
            if ($pairElement == $lastInserted){
                break;
            }
            $indexNumber += 1;
        }
        echo "Previous element was on index ".$indexNumber."<br>";
        $nodeElement = $indexNumber+1;
        echo "Moving back up to level: ".$level.", starting iteration from: ".$nodeElement.", removed element: ".$currentPath[count($currentPath)-1];
        echo "<br>";
        // Remove previously added element from that level!
        array_splice($currentPath, count($currentPath)-1, 1);
        return findBestPath($pairedtracks,$currentPath,$level,$nodeElement,$previousNode);  
    }
    else if (in_array($pairedtracks[$level][$nodeElement],$currentPath)){
        echo "[IN ARRAY]: Node element in current: ".$pairedtracks[$level][$nodeElement]." on level: ".$level;
        echo "<br>";
        //Check if node element is in array

        if ($nodeElement+1 >= $maxLength){
            //Current was final, return back up
            $level -= 1;
            $lastInserted = $currentPath[count($currentPath)-1];
            //Take index from previous level
            $indexNumber = 0;
            foreach ($pairedtracks[$level] as &$pairElement){
                if ($pairElement == $lastInserted){
                    break;
                }
                $indexNumber += 1;
            }
            echo "Previous element was on index ".$indexNumber."<br>";
            $nodeElement = $indexNumber+1;
            echo "Moving back up to level: ".$level.", starting iteration from: ".$nodeElement.", removed element: ".$currentPath[count($currentPath)-1];
            echo "<br>";
            // Remove previously added element from that level!
            array_splice($currentPath, count($currentPath)-1, 1);
            return findBestPath($pairedtracks,$currentPath,$level,$nodeElement,$previousNode);
        }
        else {
            //More elements to follow
            $nodeElement += 1;
            return findBestPath($pairedtracks,$currentPath,$level,$nodeElement,$previousNode);
        }

    }
    else {
        //Was not in array, element can be added to current path
        echo "Adding element to current path: ".$pairedtracks[$level][$nodeElement];
        echo "<br>";
        $currentPath[] = $pairedtracks[$level][$nodeElement];
        //Check if path has finalized or check more
        if (count($currentPath) == count($pairedtracks)){
            //Search finished
            return $currentPath;
        }
        else {
            //Move downwards
            $level += 1;
            return findBestPath($pairedtracks,$currentPath,$level,0,$nodeElement);
        }
    }


}

$path = findBestPath($availableTracks,[],0,0,0);
foreach ($path as &$value) {
    echo $value." ";
}
$availableTracks=[[1,4]、[3,5]、[2,3,5]、[1,2]、[2,4];
$availableTracks2=[[1,4]、[3,5]、[2,3,5]、[1]、[2,4];
函数findBestPath($pairedtracks、$currentPath、$level、$nodeElement、$previousNode){
$maxLength=计数($pairedtracks[$level]);
如果($nodeElement==$maxLength){
回显“[备份更多]
”; 回显“当前对:[”; foreach($PaireTracks[$level]as和$PaireRelation){ echo$pairement.“,”; } 回声“]
”; echo“当前路径:[”; foreach($currentPath as&$pathElement){ echo$pathElement。“,”; } 回声“]
”; //当前是最终结果,返回备份 $level-=1; $lastInserted=$currentPath[计数($currentPath)-1]; //从上一级获取索引 $indexNumber=0; foreach($PaireTracks[$level]as和$PaireRelation){ 回声“对:.$pairement.”
“; 如果($Pairement==$lastInserted){ 打破 } $indexNumber+=1; } echo“上一个元素位于索引“$indexNumber.”
”; $nodeElement=$indexNumber+1; echo“向上移动到级别:.$level.”,从:.$nodeElement.开始迭代,删除元素:.$currentPath[count($currentPath)-1]; 回声“
”; //从该级别删除以前添加的元素! 阵列拼接($currentPath,count($currentPath)-1,1); 返回findBestPath($pairedtracks、$currentPath、$level、$nodeElement、$previousNode); } else if(在数组中($paireTracks[$level][$nodeElement],$currentPath)){ echo“[在数组中]:当前“.$PaireTracks[$level][$nodeElement]”中的节点元素。级别:.$level; 回声“
”; //检查节点元素是否在数组中 如果($nodeElement+1>=$maxLength){ //当前是最终结果,返回备份 $level-=1; $lastInserted=$currentPath[计数($currentPath)-1]; //从上一级获取索引 $indexNumber=0; foreach($pairedtracks)[$leve