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