Manadar,
In _MapToString() you are checking if a key is a map or an array, though they can only be integers or strings. Also the function wasn't returning anything as you were only updating the $sOutput variable if it was a map or an array.
Also _MapSearch() isn't using the $iCompare variable.
Local $mMap[]
For $i = 0 To 19
$mMap[$i] = $i
Next
ConsoleWrite(_MapToString($mMap) & @CRLF)
Func _MapToString(Const ByRef $mMap, $sDelim_Item = "|", $sDelim_Row = @CRLF)
If $sDelim_Item = Default Then $sDelim_Item = "|"
If $sDelim_Row = Default Then $sDelim_Row = @CRLF
If Not IsMap($mMap) Then Return SetError(1, 0, -1)
Local $sRet = "", _
$vValue = 0
For $vKey In MapKeys($mMap)
$vValue = $mMap[$vKey]
$sRet &= $vKey & $sDelim_Item
__MapToString_Print($sRet, $vValue)
$sRet &= $sDelim_Row
Next
$sRet = StringTrimRight($sRet, StringLen($sDelim_Row)) ; Strip the last delimiter.
Return $sRet
EndFunc ;==>_MapToString
Func __MapToString_Print(ByRef $sOutput, ByRef $vValue)
Switch VarGetType($vValue)
Case "Array"
$sOutput &= "{Array}"
Case "Map"
$sOutput &= "{Map}"
Case Else
$sOutput &= $vValue
EndSwitch
EndFunc ;==>__MapToString_Print