本帖最后由 3131210 于 2023-10-10 11:19 编辑
倒是整了一个出来
循环的函数是这个,有点丑,大佬能不能把第一次循环(5-11行)也包含在DO里面,精简和美化一下 完整测试代码在附件
Func _GetMapPath($NowID, $NeedID, $mDepth = 10) ;现在的ID,要去的ID,搜索深度
Local $filter = $NowID & '|'
Local $arr1[0], $arr2[0], $arr3[0]
$arr1 = StringRegExp($MapPathList, '(?m)^' & $NowID & '-(?!' & StringTrimRight($filter, 1) & ' & )(\d+)', 3)
If @error Then Return -1 ;没有找到任何路径
$filter &= _ArrayToString($arr1, '|') & '|' ;增加过滤列表
For $i = 0 To UBound($arr1) - 1
If $arr1[$i] = $NeedID Then Return $NowID & '-' & $NeedID
$arr1[$i] = $NowID & '-' & $arr1[$i]
Next
Do
For $i = 0 To UBound($arr1) - 1 ;遍历数组1
$arr3 = StringRegExp($MapPathList, '(?m)^' & StringRegExpReplace($arr1[$i], '\d+-', '') & '-(?!' & StringTrimRight($filter, 1) & ' & )(\d+)', 3)
If @error Then ContinueLoop
$filter &= _ArrayToString($arr3, '|') & '|' ;增加过滤列表
For $j = 0 To UBound($arr3) - 1
If $arr3[$j] = $NeedID Then Return $arr1[$i] & '-' & $NeedID
$arr3[$j] = $arr1[$i] & '-' & $arr3[$j]
Next
_ArrayConcatenate($arr2, $arr3) ;合并到数组2
Next
$arr1 = $arr2
ReDim $arr2[0]
$mDepth -= 1
Until $mDepth = 1
Return -1
EndFunc ;==>_GetMapPath
|