Jump to content

Algorithm to detect diff between 2 unsorted arrays of diff size (or detect new Window)


Recommended Posts

I'm working on a script which runs and interacts with VLC, which is going fine except for a peculiar behavior by VLC: If it failed to play the previous video (it wouldn't start or play for some reason), the next time you try to play any video, it throws up a stupid popup telling you that the previous video failed (instead of just playing the new video). Aargh!

Since this is an unpredictable situation (for example, the user may have launched a video manually, outside my script), the best I  can come up with to find a way to detect this is to save a WinList("VLC") (or _WinAPI_EnumWindowsTop() ) before launching and then save a second list right afterwards, then look for a difference between the two, 2 dimensional arrays, which in most cases will have different sizes but will always be unsorted. (Of course, if there were some other way of detecting a new window, such as a Windows message or the like, I'd want to explore that. But I know of no such alternative).  Another possibility would be to save two _WinAPI_EnumWindowsPopup() and look for only pop-up windows, but the disadvantage of that is that I need to get the handle of the new window in case it is not a pop-up.

But once I have the lists, which will rarely contain more than 300 elements (if I use WinList()), what's a good algorithm to detect the different element(s)?  I've read a number of threads here regarding detecting the difference between two arrays, but none really seem to be directly on point due to a reliance on the two arrays having the same size, or the arrays must be sorted first. I'm quite intrigued by the scripting dictionary concept, but although creating and populating two dictionaries looks straightforward, I haven't been able to locate an example of detecting the difference between two dictionaries. Have I missed one?  I also don't know if using dictionaries would be desirable for two arrays with no more than ~300 elements (or less).

Would you kindly recommend an appropriate example, even if just in pseudo-code?  Or should I just sort both arrays first, making detecting a difference easy?

Thank you for your time!

Edited by Mbee
Link to post
Share on other sites
39 minutes ago, FrancescoDiMuro said:

@Mbee

Always appreciated your elegant through which you explain yourself.

In this case, if that error popup is not so important, then you could try an easiest way to hide/to not show that, and that way is explained here :)

Thank you most kindly, @FrancescoDiMuro. That's the nicest thing anyone's ever said to me here! Apparently, I tend to annoy the folks around these parts, certainly without intending to...  @Melba23 gives age as a (totally unnecessary) "excuse", but I'm in my 70's and have been away from programming for a very long time before discovering this incredibly great language...

The link you provided is great and quite on point (I haven't test it yet). I half-expected at some point to need to go in and potentially alter VLC's preferences (such as the vlcrc file), instead of asking the user to manually change them, as may be necessary to ignore those unimportant error reports. I'd save them before hand and restore any changes on exit.

Please accept my highest thanks for your response!

 

Link to post
Share on other sites

Alas, VLC does not consider the "sorry I screwed up last time" popup to be an "unimportant" error. Turning that off didn't prevent the popup from showing up. Bummer...

So I'm stuck with alternative solutions. At least I can narrow down the window list by specifying the string "VLC" as the title in the WinList function call. I've also confirmed that the error window is actually a popup, with some known, visible text. Also, since I can find the specific video window just launched (assuming I didn't get the weird error popup) by specifying the file path as the title (converting it to URL format in accordance with the $F title preference I have to ensure is set -- I can unpack that if anyone wishes), If I don't see the pop-up, I can stop looking and find the correctly playing video win handle readily enough.

I'm now hoping that that kind of stupid pop-up is sufficiently rare that I don't have to worry about finding the difference between before and after saved lists, but if anyone feels like taking on my OP as an exercise, I'd be fascinated to see some suggestions...

Thanks

 

Link to post
Share on other sites
10 hours ago, FrancescoDiMuro said:

@Mbee
Well, then we need more information about the Window which appears, and, if you can, a script we run, and how to reproduce the error you are getting.
There could be another way out, but let's dig one thing at time :)

Thanks for sticking with me, Francesco!

The following won't actually run because there's a lot of preliminary setup work that's too long to post, but this is the actual code I'm using with no modifications....

Func _LaunchVid( $arg_Path )

    Local $Lf_Stat, $Lf_VidName, $Lf_PID, $Lf_WinHdl, $Lf_LocalInfoAra[$Gc_NumVidListCols]
    Local $Lf_VidPath, $Lf_Drv, $Lf_Dir, $Lf_FileName, $Lf_ExtWithDot, $Lf_VLCPath
    Local $Lf_launchSuccess, $Lf_CloseDone, $Lf_CloseWaitCount

    $Lf_VLCPath = ""

    If $G_VLCExePath = "" Then

        $Lf_VLCPath = RegRead( $Gc_RegRoot, $Gc_VLCexeRegValName )
        If @error <> 0 Then
            $Lf_VLCPath = ""
        EndIf

        If $Lf_VLCPath = "" Then
            _ChooseVLC()                            ; Create and show a GUI asking for VLC exe path
        EndIf

    EndIf

    $Lf_launchSuccess = True
    Do
        Local $Lf_PrePopupList = _GetVLCFailPopups()
        If IsArray($Lf_PrePopupList) = 0 Then
            MsgBox( $MB_OK, $Gc_Title, "INTERNAL ERROR: $Lf_PrePopupList is NOT AN ARRAY!")
            Exit
        EndIf

        $Lf_VidPath = '"' & $arg_Path & '"'
        $Lf_PID = ShellExecute( $G_VLCExePath, $Lf_VidPath, $SHEX_OPEN )
        If @error <> 0 Then
            _ShowMsg("INTERNAL ERROR: Unable to launch VLC to play video")
            Beep( 1000, 500 )
            _WinAPI_FlashWindowEx( $G_VidToolGUI, 3, 2 )
            Return -1
        EndIf

        Local $Lf_PostPopupList = _GetVLCFailPopups()
        If IsArray($Lf_PostPopupList) = 0 Then
            MsgBox( $MB_OK, $Gc_Title, "INTERNAL ERROR: $Lf_PostPopupList is NOT AN ARRAY!")
            Exit
        EndIf

        Local $Lf_PostAraSize = UBound($Lf_PostPopupList)   ; = 64
        If $Lf_PostPopupList[0] > 0 Then                    ; KABOOM! Index out of range?
            Local $Lf_DiffPopupList = _PopupListDiff( $Lf_PrePopupList, $Lf_PostPopupList )
            If $Lf_DiffPopupList[0] > 0 Then
                $Lf_launchSuccess = False
                For $i = 1 To $Lf_DiffPopupList[0]
                    WinClose( $Lf_DiffPopupList[$i] )
                    $Lf_CloseDone = False
                    $Lf_CloseWaitCount = 0
                    Do
                        If WinExists( $Lf_DiffPopupList[$i] ) = 0 Then
                            $Lf_CloseDone = True
                        Else
                            Sleep( 1000 )
                            $Lf_CloseWaitCount += 1
                        EndIf
                    Until $Lf_CloseDone Or ($Lf_CloseWaitCount > 10)
                Next
            EndIf

        EndIf

    Until $Lf_launchSuccess

    Return $Lf_PID

EndFunc

; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

Func _PopupListDiff( $arg_WinList1, $arg_WinList2 )

    Local $Lf_DiffAra[1] = [ 0 ]
    Local $Lf_WinList1Size = $arg_WinList1[0]
    Local $Lf_WinList2Size = $arg_WinList2[0]
    Local $Lf_DiffAraSize = 1

    If $Lf_WinList1Size > 1 Then
        Local $Lf_SortedWinList1 = _ArraySort( $arg_WinList1, 0, 1 )
    Else
        If $Lf_WinList1Size = 0 Then
            Return $arg_WinList2
        EndIf
        Local $Lf_SortedWinList1[1]
        $Lf_SortedWinList1[0] = 1
        $Lf_SortedWinList1[1] = $arg_WinList1[1]
    EndIf

    If $Lf_WinList2Size > 1 Then
        Local $Lf_SortedWinList2 = _ArraySort( $arg_WinList1, 0, 1 )
    Else
        Return $arg_WinList2
    EndIf

    For $i = 1 To $Lf_WinList2Size
        If $i < $Lf_WinList1Size Then
            If StringUpper($Lf_SortedWinList1[$i]) <> StringUpper($Lf_SortedWinList2[$i]) Then
                ReDim $Lf_DiffAra[$Lf_DiffAraSize +1]
                $Lf_DiffAra[$Lf_DiffAraSize] = $Lf_SortedWinList2[$i]
                $Lf_DiffAra[0] += 1
                $Lf_DiffAraSize += 1
            EndIf
        Else
            ReDim $Lf_DiffAra[$Lf_DiffAraSize +1]
            $Lf_DiffAra[$Lf_DiffAraSize] = $Lf_SortedWinList2[$i]
            $Lf_DiffAra[0] += 1
            $Lf_DiffAraSize += 1
        EndIf
    Next

    Return $Lf_DiffAra

EndFunc

; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

Func _GetVLCFailPopups()

    Const $Lfc_SearchString = "VLC Media Player Portable did not close properly last time it was run and will now clean up."
    Local $Lf_FoundAra[1] = [ 0 ], $Lf_FoundIndex = 1
    Local $Lf_WinText

    Local $Lf_PopupAra = _WinAPI_EnumWindowsPopup()
    Local $Lf_NumPops = $Lf_PopupAra[0][0]
    If $Lf_NumPops = 0 Then
        Return $Lf_PopupAra
    EndIf

    For $i = 1 To $Lf_NumPops
        $Lf_WinText = WinGetText( $Lf_PopupAra[$i][0], $Lfc_SearchString )
        If $Lf_WinText <> "" Then
            If StringInStr( $Lf_WinText, $Lfc_SearchString, $STR_NOCASESENSEBASIC ) > 0 Then
                ReDim $Lf_FoundAra[$Lf_FoundIndex +1]
                $Lf_FoundAra[$Lf_FoundIndex] = $Lf_PopupAra[$i][0]
                $Lf_FoundAra[0] += 1
                $Lf_FoundIndex += 1
            EndIf
        EndIf
    Next

    Return $Lf_FoundAra

EndFunc

But something weird is going on: At line 46 ("If $Lf_PostPopupList[0] > 0 Then"), I constantly get an "index out of range" error (image posted below). As you can see, I've put in tests to make sure I'm returning an actual array type, and the UBound of PostPopupList = 46, so what the heck is going wrong?  I need a second set of eyes, please.

Once I get past that issue, I think these algorithms will do what I want, but even so, this might not be the best way to go.  Oh, and my naming conventions don't match the AutoIt standard (not that there's anything wrong with that standard), it's just that I like to know the scope of variables as well. So $Lf_ represents a variable that's Local to the specific Function it appears in.

Thanks for lending a hand!

Error.jpg

Edited by Mbee
Typos
Link to post
Share on other sites

isnt hiding these errors inside VLC also an option, rather than accomodating the behavior via brute force?

Does this parameter kill those warnings?

vlc.exe --no-qt-error-dialogs

 

,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-.
|(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/
(_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_)
| | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) (
| | | | |)| | \ / | | | | | |)| | `--. | |) \ | |
`-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_|
'-' '-' (__) (__) (_) (__)

Link to post
Share on other sites
24 minutes ago, iamtheky said:

isnt hiding these errors inside VLC also an option, rather than accomodating the behavior via brute force?

Does this parameter kill those warnings?

vlc.exe --no-qt-error-dialogs

 

Thanks, I'll try it and report back..

Link to post
Share on other sites

So far, so good!  Thanks a bunch, @iamtheky !  Employing both techniques has worked so far -- hooray!

Of course, if the user launches a video independently, all bets are off. But I have reduced the probability of someone doing that by setting things up such that she/he can simply drop a video on my GUI, whereupon I'll launch it with the "--no-qt-error-dialogs' option.  I'll wait to call this Solved until I do some more testing, but I'm extremely happy with the valuable assistance you both have kindly provided me!

By the way, I discovered yet another annoying popup that can show up: " Another instance of VLC Media Player is already running. Please close other instances of VLC Media Player before launching VLC Media Player". Happily, the option passed along by iamthekey appears to eliminate this one, too!

I have another problem related to VLC in this app: The weird encoding of file paths or filenames that VLC puts in the titles of the videos I launch, particularly if unicode/wide characters occur in them. You see, it's absolutely necessary that I be able to identify the window in which the video is being played, and the easiest way to do that is, first, to tell VLC to use the full path in the title bar. Then I use a WinWait() call, specifying the path that I launched.

But if the path includes spaces (as is almost always the case), instead of using URL encoding and encoding those spaces as "%20", VLC replaces them with plus signs. Okay, I can easily handle that for non-wide, ASCII characters. But if the path includes wide, Unicode characters, VLC appears to use URL encoding (I'm not certain of this, but I think so).  Thus, it's a weird hybrid encoding that I don't know how to reproduce, since I don't know how to distinguish wide characters that need to be URL encoded versus those which do not.  Any tips?

I've posted a question asking about this strange encodeing at the Windows Troubleshooting sub-forum at VideoLAN.org, but have not received an answer yet...

 

Edited by Mbee
Added another problem that @iamthekey's suggestion solved
Link to post
Share on other sites

do they fire with the 8.3 name?  (filegetshortname)

,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-.
|(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/
(_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_)
| | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) (
| | | | |)| | \ / | | | | | |)| | `--. | |) \ | |
`-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_|
'-' '-' (__) (__) (_) (__)

Link to post
Share on other sites

Well, I'm very confused, since I definitely saw plus signs instead of %20 s, but now they're all %20s again!  Here's a fragment that I got from inside the graphical debugger:

"%3F+No%2C+You+Shut+Up%21+-+Evolution+vs+Intelligent+Design+-+YouTube.mp4"

But now it's:

"%E2%96%B6%20No%2C%20You%20Shut%20Up%21%20-%20Evolution%20vs%20Intelligent%20Design%20-%20YouTube.mp4 - VLC media player"

Well, I'll use full URL encoding unless that ends up not working either...

Link to post
Share on other sites

DAMMIT!  The

--no-qt-error-dialogs

... option doesn't work after all. I keep getting both of the error pop-ups described earlier:

"did not close properly last time it was run and will now clean up."

 - and -

" Another instance of VLC Media Player is already running. Please close other instances of VLC Media Player before launching VLC Media Player"

I was extremely hopeful that option would be sufficient, but VLC's developers had/have some strange ideas about error reporting. The second pop-up is far stupider than the first, since I've always set the preferences to allow multiple instances and I've actually launched up to about 20 instances at times for decades now.

Back to my OP, I'm afraid.

Edited by Mbee
Link to post
Share on other sites
Local $oDict1 = ObjCreate("Scripting.Dictionary")
Local $oDict2 = ObjCreate("Scripting.Dictionary")

$odict1.add("B","Value b")
$odict1.add("C","Value c")
$odict1.add("D","Value d")
$odict1.add("E","Value e")

$odict2.add("A","Value a")
$odict2.add("B","Value b")
$odict2.add("C","Value c")
$odict2.add("E","Value e")
$odict2.add("F","Value f")

$diff=compDic($oDict1,$oDict2)
for $i=0 to $diff.count-1
    consolewrite($diff.keys[$i])
Next

consolewrite(@CRLF)

$diff=compDic($oDict2,$oDict1)
for $i=0 to $diff.count-1
    consolewrite($diff.keys[$i])
Next


func compDic($d1,$d2)
    Local $oDiff = ObjCreate("Scripting.Dictionary")

    for $i=0 to $d1.count-1
        if $d2.exists($d1.keys[$i]) Then
;~          consolewrite($d1.keys[$i])
        else
            $oDiff.add($d1.keys[$i], $d1.items[$i])
        EndIf
    Next

    return $oDiff
endfunc

 

Link to post
Share on other sites

Thank you, @junkew !  I'm eager to learn more about these dictionary objects.  Here is my first attempt to implement your example code above to fit my needs, but I'm sure it's inadequate. You won't have any trouble keeping in mind that I'm an old man with only an embarrassingly tiny fraction of my former intellectual capacity :unsure:

I'm most unsure about how to enter and retrieve the elements of the necessary two-dimensional popup list array, as indicated by the double question marks in the comments.

I'll post the most relevant functions, with my uneducated interpretation of your code above first...

Func _ListDiff( ByRef $arg_PreList, ByRef $arg_PostList )

    Local $Lf_DiffAra[1][2] = [ [0, 0] ]
    Local $Lf_DiffAraSize = 1
    Local $Lf_PreListSize = $arg_PreList[0][0]
    Local $Lf_PostListSize = $arg_PostList[0][0]

    If $Lf_PreListSize = 0 Then
        Return $arg_PostList
    EndIf

    If $Lf_PostListSize = 0 Then
        Return $arg_PostList
    EndIf

    Local $Lf_PreDictObj = ObjCreate("Scripting.Dictionary")
    Local $Lf_PostDictObj = ObjCreate("Scripting.Dictionary")

    For $i = 1 To $Lf_PreListSize
        $Lf_PreDictObj.add($arg_PreList[$i][1], $arg_PreList[$i][0])    ; Class name, Window handle
    Next

    For $i = 1 To $Lf_PostListSize
        $Lf_PostDictObj.add($arg_PostList[$i][1], $arg_PostList[$i][0])
    Next

    Local $diff = compDic($Lf_PreDictObj, $Lf_PostDictObj)
    for $i = 0 to $diff.count-1
        ReDim $Lf_DiffAra[$Lf_DiffAraSize +1][2]
        $Lf_DiffAra[$Lf_DiffAraSize][0] = $diff.items[$i][0]    ; ??
        $Lf_DiffAra[$Lf_DiffAraSize][1] = $diff.items[$i][1]    ; ??
        $Lf_DiffAra[0][0] += 1
        $Lf_DiffAraSize += 1
;~      consolewrite($diff.keys[$i])
    Next

;~  consolewrite(@CRLF)

;~  $diff = compDic($Lf_PostDictObj, $Lf_PreDictObj)
;~  for $i = 0 to $diff.count-1
;~      consolewrite($diff.keys[$i])
;~  Next

    Return $Lf_DiffAra

EndFunc

func compDic($d1, $d2)
    Local $oDiff  =  ObjCreate("Scripting.Dictionary")

    for $i = 0 to $d1.count-1
        if $d2.exists($d1.keys[$i]) Then
;~          consolewrite($d1.keys[$i])
        else
            $oDiff.add($d1.keys[$i], $d1.items[$i])
        EndIf
    Next

    return $oDiff
endfunc


Func _GetVLCFailPopups()

    Const $Lfc_SearchStringCount = 2
    Const $Lfc_SearchStringAra[$Lfc_SearchStringCount] = [ "did not close properly last time it was run and will now clean up.", _
                                                           "Another instance of VLC Media Player is already running." ]
    Local $Lf_FoundAra[1][2] = [[ 0, 0 ]], $Lf_FoundIndex = 1
    Local $Lf_WinText

    Local $Lf_PopupAra = _WinAPI_EnumWindowsPopup()
    Local $Lf_NumPops = $Lf_PopupAra[0][0]
    If $Lf_NumPops = 0 Then
        Return $Lf_PopupAra
    EndIf

    For $i = 1 To $Lf_NumPops
        $Lf_WinText = WinGetText( $Lf_PopupAra[$i][0] )
        If $Lf_WinText <> "" Then
            For $j = 0 To $Lfc_SearchStringCount -1
                If StringInStr( $Lf_WinText, $Lfc_SearchStringAra[$j], $STR_NOCASESENSEBASIC ) > 0 Then
                    ReDim $Lf_FoundAra[$Lf_FoundIndex +1][2]
                    $Lf_FoundAra[$Lf_FoundIndex][0] = $Lf_PopupAra[$i][0]
                    $Lf_FoundAra[$Lf_FoundIndex][1] = $Lf_PopupAra[$i][1]
                    $Lf_FoundAra[0][0] += 1
                    $Lf_FoundIndex += 1
                EndIf
            Next
        EndIf
    Next

    Return $Lf_FoundAra

EndFunc


Func _LaunchVid( $arg_Path )

    Local $Lf_Stat, $Lf_VidName, $Lf_PID, $Lf_WinHdl, $Lf_LocalInfoAra[$Gc_NumVidListCols]
    Local $Lf_VidPath, $Lf_Drv, $Lf_Dir, $Lf_FileName, $Lf_ExtWithDot, $Lf_VLCPath
    Local $Lf_launchSuccess, $Lf_CloseDone, $Lf_CloseWaitCount

    $Lf_VLCPath = ""

    If $G_VLCExePath = "" Then

        $Lf_VLCPath = RegRead( $Gc_RegRoot, $Gc_VLCexeRegValName )
        If @error <> 0 Then
            $Lf_VLCPath = ""
        EndIf

        If $Lf_VLCPath = "" Then
            _ChooseVLC()                            ; Create and show a GUI asking for VLC exe path
        EndIf

    EndIf

    $Lf_launchSuccess = True
    Do
        Local $Lf_PrePopupList = _GetVLCFailPopups()
        If IsArray($Lf_PrePopupList) = 0 Then
            MsgBox( $MB_OK, $Gc_Title, "INTERNAL ERROR: $Lf_PrePopupList is NOT AN ARRAY!")
            Exit
        EndIf

        $Lf_VidPath = '"' & $arg_Path & '"'
        $Lf_PID = ShellExecute( $G_VLCExePath, $Lf_VidPath, $SHEX_OPEN )
        If @error <> 0 Then
            _ShowMsg("INTERNAL ERROR: Unable to launch VLC to play video")
            Beep( 1000, 500 )
            _WinAPI_FlashWindowEx( $G_VidToolGUI, 3, 2 )
            Return -1
        EndIf

        Local $Lf_PostPopupList = _GetVLCFailPopups()
        If IsArray($Lf_PostPopupList) = 0 Then
            MsgBox( $MB_OK, $Gc_Title, "INTERNAL ERROR: $Lf_PostPopupList is NOT AN ARRAY!")
            Exit
        EndIf

        Local $Lf_PostAraSize = UBound($Lf_PostPopupList)   ; = 64
        If $Lf_PostPopupList[0] > 0 Then                    ; KABOOM! Index out of range?
            Local $Lf_DiffPopupList = _PopupListDiff( $Lf_PrePopupList, $Lf_PostPopupList )
            If $Lf_DiffPopupList[0] > 0 Then
                $Lf_launchSuccess = False
                For $i = 1 To $Lf_DiffPopupList[0]
                    WinClose( $Lf_DiffPopupList[$i] )
                    $Lf_CloseDone = False
                    $Lf_CloseWaitCount = 0
                    Do
                        If WinExists( $Lf_DiffPopupList[$i] ) = 0 Then
                            $Lf_CloseDone = True
                        Else
                            Sleep( 1000 )
                            $Lf_CloseWaitCount += 1
                        EndIf
                    Until $Lf_CloseDone Or ($Lf_CloseWaitCount > 10)
                Next
            EndIf

        EndIf

    Until $Lf_launchSuccess

    Return $Lf_PID

EndFunc

Did I get it anywhere close to what I need?

Thanks for your time!

Edited by Mbee
Link to post
Share on other sites

@Mbee

A Dictionary object is like an associative array; it lets you identify your items with a key, which can be a string or an integer, bu nor an array.

Your items can be any type of data, arrays too, but that's not the case!

So, when you retrieve your data from the dictionary object, you just need to provide the key you set for your item when you added it, and you're done; the Dictionary object is managed as a 1-D array, which is the case.

By the way, it's the moment to take a look at VLC Object:

Global $objVLC = ObjCreate("VideoLAN.VLCPlugin.2")

:)

Click here to see my signature:

Spoiler

ALWAYS GOOD TO READ:

 

Link to post
Share on other sites

Seehttps://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/dictionary-object for details of a dictionary. Alternative could be to look at array.au3 which has https://www.autoitscript.com/autoit3/docs/libfunctions/_ArraySearch.htm

Not sure on your solution but syntax should be without second selector and the dictionary in itself has other 'arrays' like keys, items you have to use something like 

 $Lf_DiffAra[$Lf_DiffAraSize][0] = $diff.keys[$i]    ; ??
        $Lf_DiffAra[$Lf_DiffAraSize][1] = $diff.items[$i]    ; ??
Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...