Array Dimensionen

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

effel
Posts: 546
Joined: 16 Jan 2018, 13:34

Array Dimensionen

Post by effel » 24 Apr 2021, 19:54

Hallo,

beim 'versuchen' nit Arrays hänge ich an testx["D",22,33,44] := 4 ​fest.

Wenn ich die vierte Dimension versuche, endet es bei mir ganz klar beim logischen Denken

Code: Select all

testx := object()
testx["A"] := 1
testx["B",22] := 2
testx["C",22,33] := 3
testx["C",22,34] := "3b"
testx["D",22,33,44] := 4
testx["D",22,33,44,55] := 5

​MsgBox % testX(testx)

/*
---------------------------
__tmp.ahk
---------------------------
testx[A] = 1
testx[B, 22] = 2
testx[C, 22, 33] = 3
testx[C, 22, 34] = 3b
testx[D, 22, 33] = 

---------------------------
OK   
---------------------------
*/
testX(List)
{
	for keyA, elementA in List
              ​if IsObject(elementA)
              ​for keyB, elementB in elementA
                         ​if IsObject(elementB)
                         ​for keyC, elementC in elementB
                           ​X .= "testx[" keyA ", " keyB ", " keyC "] = " elementC "`n"
                           ​else
                           ​X .= "testx[" keyA ", " keyB "] = " elementB "`n"
               ​else
               ​X .= "testx[" keyA "] = " elementA "`n"
               ​return X
}

effel
Posts: 546
Joined: 16 Jan 2018, 13:34

Re: Array Dimensionen

Post by effel » 24 Apr 2021, 20:37

ich habs

Code: Select all

testx := object()
testx["A"] := 1
testx["B",22] := 2
testx["C",22,33] := 3
testx["C",22,34] := "3b"
testx["D",22,33,44] := 4
testx["E",22,33,44,55] := 5
testx["Aaa"] := 1
testx["Bbb",22] := 2
testx["Ccc",22,33] := 3
testx["Ccc",22,34] := "3b"
testx["Ddd",22,33,44] := 4
testx["Eee",22,33,44,55] := 5
Loop 9
testx["FFF" A_Index,22  A_Index, A_Index,44  A_Index,5 A_Index] :=  A_Index



Gui, +hwndGui
Gui, Add, ListView, x20 w350 r21 +LV0x4000 +LV0x00010000 Grid +LV0x20 hwndLVA vLVA Grid cBlack BackgroundFFDD99, index|arr.1|arr.2|arr.3|arr.4|arr.5|arr.6
Gui, Show
; MsgBox % testX(testx)
clipboard := testX(testx)

/*
testx[A] = 1
testx[Aaa] = 1
testx[B, 22] = 2
testx[Bbb, 22] = 2
testx[C, 22, 33] = 3
testx[C, 22, 34] = 3b
testx[Ccc, 22, 33] = 3
testx[Ccc, 22, 34] = 3b
testx[D, 22, 33, 44] = 4
testx[Ddd, 22, 33, 44] = 4
testx[E, 22, 33, 44, 55] = 5
testx[Eee, 22, 33, 44, 55] = 5
testx[FFF1, 221, 1, 441, 51] = 1
testx[FFF2, 222, 2, 442, 52] = 2
testx[FFF3, 223, 3, 443, 53] = 3
testx[FFF4, 224, 4, 444, 54] = 4
testx[FFF5, 225, 5, 445, 55] = 5
testx[FFF6, 226, 6, 446, 56] = 6
testx[FFF7, 227, 7, 447, 57] = 7
testx[FFF8, 228, 8, 448, 58] = 8
testx[FFF9, 229, 9, 449, 59] = 9
*/

testX(List)
{
	 for keyA, elementA in List
               if IsObject(elementA)
               for keyB, elementB in elementA
                     if IsObject(elementB)
                     for keyC, elementC in elementB
                           if IsObject(elementC)
                           for keyD, elementD in elementC
                                if IsObject(elementD)
                                for keyE, elementE in elementD
                            {
                            ++AIndexE
                            X .= "testx[" keyA ", " keyB ", " keyC ", " keyD ", " keyE "] = " elementE "`n"
                            Lv_Add("", AIndexE, KeyA, KeyB, KeyC, KeyD, KeyE, elementE)
                            }else{
                            ++AIndexD
                            X .= "testx[" keyA ", " keyB ", " keyC ", " keyD "] = " elementD "`n"
                            Lv_Add("", AIndexD, KeyA, KeyB, KeyC, KeyD, elementD)
                            }else{
                            ++AIndexC
                            X .= "testx[" keyA ", " keyB ", " keyC "] = " elementC "`n"
                            Lv_Add("", AIndexC, KeyA, KeyB, KeyC, elementC)
                            }else{
                            ++AIndexB
                            X .= "testx[" keyA ", " keyB "] = " elementB "`n"
                            Lv_Add("", AIndexB, KeyA, KeyB,elementB)
                }else{
                ++AIndexA
                X .= "testx[" keyA "] = " elementA "`n"
                Lv_Add("", AIndexA, KeyA, elementA)
                }
                Loop, % LV_GetCount("Columns")
                LV_ModifyCol(A_Index, 45)	
                return X
}

just me
Posts: 9482
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Array Dimensionen

Post by just me » 25 Apr 2021, 07:32

Moin effel,

ein (kürzerer) rekursiver Ansatzt ist auch hier möglich. Wenn es darum geht, ein Array mit einer bekannten maximalen Anzahl von Dimensionen in ein ListView zu übertragen, geht das z.B. auch so:

Code: Select all

#NoEnv
SetBatchLines, -1

TestX := {}
TestX["A"] := 1
TestX["B",22] := 2
TestX["C",22,33] := 3
TestX["C",22,34] := "3b"
TestX["D",22,33,44] := 4
TestX["E",22,33,44,55] := 5
TestX["Aaa"] := 1
TestX["Bbb",22] := 2
TestX["Ccc",22,33] := 3
TestX["Ccc",22,34] := "3b"
TestX["Ddd",22,33,44] := 4
TestX["Eee",22,33,44,55] := 5
Loop 9
   TestX["FFF" A_Index,22  A_Index, A_Index,44  A_Index,5 A_Index] :=  A_Index

Gui, Add, ListView, x20 w350 r21 +LV0x4000 +LV0x00010000 Grid +LV0x20 hwndLVA vLVA Grid cBlack BackgroundFFDD99, Key1|Key2|Key3|Key4|Key5|Value
FillLV(TestX)
Gui, Show, , Array -> ListView
Return
GuiClose:
ExitApp

FillLV(Arr, Row := "", Recursive := 0) {
   For K, V In Arr {
      If (Recursive)
         Row .= "`t" . K
      Else
         Row := K
      If IsObject(V)
         FillLV(V, Row, 1)
      Else {
         RI := LV_Add("", StrSplit(Row, "`t")*)
         LV_Modify(RI, "Col6", V)
      }
   }
   Loop, % LV_GetCount("Col")
      LV_ModifyCol(A_Index, "AutoHdr")
}

effel
Posts: 546
Joined: 16 Jan 2018, 13:34

Re: Array Dimensionen

Post by effel » 25 Apr 2021, 16:08

just me wrote:
25 Apr 2021, 07:32
...rekursiver Ansatz...
Danke Just Me,

die Funktion ruft sich selbst auf? Was Passiert mit dem noch nicht beendeten Funktionsaufruf in dem Moment wo

Code: Select all

      If IsObject(V)
         FillLV(V, Row, 1)
erreicht wird?

effel
Posts: 546
Joined: 16 Jan 2018, 13:34

Re: Array Dimensionen

Post by effel » 25 Apr 2021, 22:02

erster Versuch erfolgreich

Code: Select all

  FileEncoding, UTF-8


Gui, +hwndGui
Gui, Add, ListView, x20 w750 r50 +LV0x4000 +LV0x00010000 Grid +LV0x20 hwndLVA vLVA Grid cBlack BackgroundFFDD99, index|OBJECT/KEY|key.1|Key.2|Key.3|Key.4|Key.5|Key.6|Key.7|Key.8|Key.9|Key.10|wert
Gui, Show

GeoIP()											; load object using the 'https://ipapi.co/' API

_clipboard := ArrayIterum(GeoIP)

Return

GeoIP(type:="") {                           ; https://www.autohotkey.com/boards/viewtopic.php?f=10&t=86627 by BoBo
		Global GeoIP	:= {}
		whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")
		whr.SetTimeouts(0, 5000, 5000, 100000)					; adjust timeouts accordingly. Default: (0, 30000, 30000, 600000)
		whr.Open("GET","https://ipapi.co/csv/", False)				; optional output formats are: json, jsonp, xml, csv, yaml.
		whr.Send()
		Sleep 100
		k := StrSplit(StrSplit(Trim(whr.ResponseText,"`n`r"),"`n").1,",")	; processing retrieved csv's 1st line
		v := StrSplit(StrSplit(Trim(whr.ResponseText,"`n`r"),"`n").2,",")	; processing retrieved csv's 2nd line
		Loop % k.Length() 
			GeoIP[Trim(k[A_Index],"`n`r")] := v[A_Index]
		Return
	}


ArrayIterum(arr)
{
	 for keyA, wertA in Arr
               if IsObject(wertA)
               for keyB, wertB in wertA
                     if IsObject(wertB)
                     for keyC, wertC in wertB
                           if IsObject(wertC)
                           for keyD, wertD in wertC
                                if IsObject(wertD)
                                for keyE, wertE in wertD
                                     if IsObject(wertE)
                                     for keyF, wertF in wertE
                                          if IsObject(wertF)
                                          for keyG, wertG in wertF
                                               if IsObject(wertG)
                                               for keyH, wertH in wertG
                                                    if IsObject(wertH)
                                                    for keyI, wertI in wertH
                                                         if IsObject(wertI)
                                                         for keyJ, wertJ in wertI
                                                              if IsObject(wertJ)
                                                              for keyK, wertK in wertJ
                {
                                    ++AIndexK
                                    X .= "testx[" keyA ", " keyB ", " keyC ", " keyD ", " keyE ", " keyF ", " keyG ", " keyH ", " keyI ", " keyJ ", " keyk "] = " wertk "`n"
                                    RI := Lv_Add("", AIndexK, KeyA, KeyB, KeyC, KeyD, KeyE, KeyF, KeyG, KeyH, KeyI, KeyJ, KeyK)
                                    LV_Modify(RI, "Col13", wertK)
                                  }else{
                                  ++AIndexJ
                                  X .= "testx[" keyA ", " keyB ", " keyC ", " keyD ", " keyE ", " keyF ", " keyG ", " keyH ", " keyI ", " keyJ "] = " wertj "`n"
                                  RI := Lv_Add("", AIndexJ, KeyA, KeyB, KeyC, KeyD, KeyE, KeyF, KeyG, KeyH, KeyI, KeyJ)
                                  LV_Modify(RI, "Col13", wertJ)
                                }else{
                                ++AIndexI
                                X .= "testx[" keyA ", " keyB ", " keyC ", " keyD ", " keyE ", " keyF ", " keyG ", " keyH ", " keyI "] = " wertI "`n"
                                RI := Lv_Add("", AIndexI, KeyA, KeyB, KeyC, KeyD, KeyE, KeyF, KeyG, KeyH, KeyI)
                                LV_Modify(RI, "Col13", wertI)
                              }else{
                              ++AIndexH
                              X .= "testx[" keyA ", " keyB ", " keyC ", " keyD ", " keyE ", " keyF ", " keyG ", " keyH "] = " wertH "`n"
                              RI := Lv_Add("", AIndexH, KeyA, KeyB, KeyC, KeyD, KeyE, KeyF, keyG, keyH)
                              LV_Modify(RI, "Col13", wertH)
                            }else{
                            ++AIndexG
                            X .= "testx[" keyA ", " keyB ", " keyC ", " keyD ", " keyE ", " keyF ", " keyG "] = " wertG "`n"
                            RI := Lv_Add("", AIndexG, KeyA, KeyB, KeyC, KeyD, KeyE, KeyF, KeyG)
                            LV_Modify(RI, "Col13", wertG)
                          }else{
                          ++AIndexF
                          X .= "testx[" keyA ", " keyB ", " keyC ", " keyD ", " keyE ", " keyF "] = " wertF "`n"
                          RI := Lv_Add("", AIndexF, KeyA, KeyB, KeyC, KeyD, KeyE, KeyF)
                          LV_Modify(RI, "Col13", wertF)
                        }else{
                        ++AIndexE
                        X .= "testx[" keyA ", " keyB ", " keyC ", " keyD ", " keyE "] = " wertE "`n"
                        RI := Lv_Add("", AIndexE, KeyA, KeyB, KeyC, KeyD, KeyE)
                        LV_Modify(RI, "Col13", wertE)
                      }else{
                      ++AIndexD
                      X .= "testx[" keyA ", " keyB ", " keyC ", " keyD "] = " wertD "`n"
                      RI := Lv_Add("", AIndexD, KeyA, KeyB, KeyC, KeyD)
                      LV_Modify(RI, "Col13", wertD)
                    }else{
                    ++AIndexC
                    X .= "testx[" keyA ", " keyB ", " keyC "] = " wertC "`n"
                    RI := Lv_Add("", AIndexC, KeyA, KeyB, KeyC)
                    LV_Modify(RI, "Col13", wertC)
                  }else{
                  ++AIndexB
                  X .= "testx[" keyA ", " keyB "] = " wertB "`n"
                  RI := Lv_Add("", AIndexB, KeyA, KeyB)
                  LV_Modify(RI, "Col13", wertB)
                }else{
                ++AIndexA
                X .= "testx[" keyA "] = " wertA "`n"
                RI := Lv_Add("", AIndexA, KeyA)
                LV_Modify(RI, "Col13", wertA)
                }
                Loop, % LV_GetCount("Columns")
                LV_ModifyCol(A_Index, "AutoHdr")
                LV_ModifyCol(1, 0)
                return X
}

effel
Posts: 546
Joined: 16 Jan 2018, 13:34

Re: Array Dimensionen

Post by effel » 25 Apr 2021, 22:26

arraytest.png
arraytest.png (52.88 KiB) Viewed 465 times

Code: Select all

APIkey := 
FileEncoding, UTF-8
Gui, +hwndGui
Gui, Add, ListView, x20 w850 r30 +LV0x4000 +LV0x00010000 Grid +LV0x20 hwndLVA vLVA Grid cBlack BackgroundFFDD99, index|OBJECT/KEY|key.1|Key.2|Key.3|Key.4|Key.5|Key.6|Key.7|Key.8|Key.9|Key.10|wert
Gui, Show

JSON := omdb("tt0818165",,,APIKey)
AHKArr := JSON2AHK(JSON)
_clipboard := ArrayIterum(AHKArr)
MsgBox % AHKArr["Ratings", 1, "Source"]
Return

;#########################################################################################################################
; ======================================================================================================================
; https://www.autohotkey.com/boards/viewtopic.php?p=388487#p388487 by BoBo
; ======================================================================================================================
omdb(req:="",year:="",p:=0,APIkey:="") {
	if !req
		Return "Missing parameter"
	req	:=	SubStr(req,1,2)="tt"	? "i=" . req . "&plot=full"
		:	(p > 0)					? "s=" . StrReplace(req,A_Space,"+") . "&y=" . year . "&page=" . p . "&plot=full"
		:	(req != "")				? "t=" . StrReplace(req,A_Space,"+") . "&y=" . year . "&plot=full"
		:	""

	myAPIkey:=	APIkey  				; http://omdbapi.com/apikey.aspx
	reqURL	:=	"http://www.omdbapi.com/?apikey="
			.	 myAPIkey
			.	"&"
			.	 req

;	omdb := JSON.Load(UrlDownloadToVar(reqURL))		; laden in ein object
	omdb := UrlDownloadToVar(reqURL)			; 
	Return omdb
	}


ArrayIterum(arr)
{
	 for keyA, wertA in Arr
               if IsObject(wertA)
               for keyB, wertB in wertA
                     if IsObject(wertB)
                     for keyC, wertC in wertB
                           if IsObject(wertC)
                           for keyD, wertD in wertC
                                if IsObject(wertD)
                                for keyE, wertE in wertD
                                     if IsObject(wertE)
                                     for keyF, wertF in wertE
                                          if IsObject(wertF)
                                          for keyG, wertG in wertF
                                               if IsObject(wertG)
                                               for keyH, wertH in wertG
                                                    if IsObject(wertH)
                                                    for keyI, wertI in wertH
                                                         if IsObject(wertI)
                                                         for keyJ, wertJ in wertI
                                                              if IsObject(wertJ)
                                                              for keyK, wertK in wertJ
                {
                                    ++AIndexK
                                    X .= "testx[" keyA ", " keyB ", " keyC ", " keyD ", " keyE ", " keyF ", " keyG ", " keyH ", " keyI ", " keyJ ", " keyk "] = " wertk "`n"
                                    RI := Lv_Add("", AIndexK, KeyA, KeyB, KeyC, KeyD, KeyE, KeyF, KeyG, KeyH, KeyI, KeyJ, KeyK)
                                    LV_Modify(RI, "Col13", wertK)
                                  }else{
                                  ++AIndexJ
                                  X .= "testx[" keyA ", " keyB ", " keyC ", " keyD ", " keyE ", " keyF ", " keyG ", " keyH ", " keyI ", " keyJ "] = " wertj "`n"
                                  RI := Lv_Add("", AIndexJ, KeyA, KeyB, KeyC, KeyD, KeyE, KeyF, KeyG, KeyH, KeyI, KeyJ)
                                  LV_Modify(RI, "Col13", wertJ)
                                }else{
                                ++AIndexI
                                X .= "testx[" keyA ", " keyB ", " keyC ", " keyD ", " keyE ", " keyF ", " keyG ", " keyH ", " keyI "] = " wertI "`n"
                                RI := Lv_Add("", AIndexI, KeyA, KeyB, KeyC, KeyD, KeyE, KeyF, KeyG, KeyH, KeyI)
                                LV_Modify(RI, "Col13", wertI)
                              }else{
                              ++AIndexH
                              X .= "testx[" keyA ", " keyB ", " keyC ", " keyD ", " keyE ", " keyF ", " keyG ", " keyH "] = " wertH "`n"
                              RI := Lv_Add("", AIndexH, KeyA, KeyB, KeyC, KeyD, KeyE, KeyF, keyG, keyH)
                              LV_Modify(RI, "Col13", wertH)
                            }else{
                            ++AIndexG
                            X .= "testx[" keyA ", " keyB ", " keyC ", " keyD ", " keyE ", " keyF ", " keyG "] = " wertG "`n"
                            RI := Lv_Add("", AIndexG, KeyA, KeyB, KeyC, KeyD, KeyE, KeyF, KeyG)
                            LV_Modify(RI, "Col13", wertG)
                          }else{
                          ++AIndexF
                          X .= "testx[" keyA ", " keyB ", " keyC ", " keyD ", " keyE ", " keyF "] = " wertF "`n"
                          RI := Lv_Add("", AIndexF, KeyA, KeyB, KeyC, KeyD, KeyE, KeyF)
                          LV_Modify(RI, "Col13", wertF)
                        }else{
                        ++AIndexE
                        X .= "testx[" keyA ", " keyB ", " keyC ", " keyD ", " keyE "] = " wertE "`n"
                        RI := Lv_Add("", AIndexE, KeyA, KeyB, KeyC, KeyD, KeyE)
                        LV_Modify(RI, "Col13", wertE)
                      }else{
                      ++AIndexD
                      X .= "testx[" keyA ", " keyB ", " keyC ", " keyD "] = " wertD "`n"
                      RI := Lv_Add("", AIndexD, KeyA, KeyB, KeyC, KeyD)
                      LV_Modify(RI, "Col13", wertD)
                    }else{
                    ++AIndexC
                    X .= "testx[" keyA ", " keyB ", " keyC "] = " wertC "`n"
                    RI := Lv_Add("", AIndexC, KeyA, KeyB, KeyC)
                    LV_Modify(RI, "Col13", wertC)
                  }else{
                  ++AIndexB
                  X .= "testx[" keyA ", " keyB "] = " wertB "`n"
                  RI := Lv_Add("", AIndexB, KeyA, KeyB)
                  LV_Modify(RI, "Col13", wertB)
                }else{
                ++AIndexA
                X .= "testx[" keyA "] = " wertA "`n"
                RI := Lv_Add("", AIndexA, KeyA)
                LV_Modify(RI, "Col13", wertA)
                }
                Loop, % LV_GetCount("Columns")
                LV_ModifyCol(A_Index, "AutoHdr")
                LV_ModifyCol(1, 0)
                return X
}


; ======================================================================================================================
; Originally released by teadrinker -> https://www.autohotkey.com/boards/viewtopic.php?p=333543#p333543
; ======================================================================================================================
JSON2AHK(JSON, Recursive := False) {
   Local
   Static Doc := ComObjCreate("htmlfile")
        , __  := Doc.write("<meta http-equiv=""X-UA-Compatible"" content=""IE=9"">")
        , JS  := Doc.parentWindow
   If (!Recursive)
      Obj := JSON2AHK(JS.eval("(" . JSON . ")"), True)
   Else If !IsObject(JSON)
      Obj := JSON
   Else If (JSON.toString() != "[object Object]") {
      Obj := []
      Loop % JSON.length
         Obj.Push(JSON2AHK(JSON[A_Index - 1], True) )
   }
   Else {
      Obj := {}
      Keys := JS.Object.keys(JSON)
      Loop % Keys.length {
         K := Keys[A_Index - 1]
         Obj[K] := JSON2AHK(JSON[K], True)
      }
   }
   Return Obj
}

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Array Dimensionen

Post by BoBo » 26 Apr 2021, 01:17

Sieht noch nach reichlich redundantem code aus?! :think:

just me
Posts: 9482
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Array Dimensionen

Post by just me » 26 Apr 2021, 04:32

effel wrote:
25 Apr 2021, 16:08
... die Funktion ruft sich selbst auf? Was Passiert mit dem noch nicht beendeten Funktionsaufruf in dem Moment wo ... erreicht wird?
Der Trick bei dieser Art von rekursiven Aufrufen liegt in den Funktionsparametern.

Beim ursprünglichen Aufruf müssen die 'optionalen' Parameter Row und Recursive unverändert bleiben.

Wenn Recursive 0 ist, bedeutet das für die Funktion, dass die For-Schleife eine neue Zeile startet. Die Variable Row wird mit dem Schlüssel gefüllt. Wenn der Schlüssel auf einen einfachen Wert zeigt, wird die Zeile ausgegeben. Wenn der Schlüssel auf ein Objekt zeigt, wird die Funktion mit diesem Objekt neu aufgerufen. Dabei wird der bisherige Inhalt der Variablen Row übergeben und der Parameter Recursive auf 1 gesetzt.

Wenn Resursive 1 ist, bedeutet das für die Funktion, dass der in der For-Schleife erkannte Schlüssel an die als Parameter übergebene Variable Row angehängt werden muss. Der Rest bleibt gleich. Wenn der Schlüssel auf einen einfachen Wert zeigt, ....

Wenn die For-Schleife einer Rekursionsstufe der Funktion komplett abgearbeitet ist, beendet sich die Funktion, kehrt zum 'übergeordneten' Aufruf zurück und setzt deren For-Schleife mit der in diesem Aufruf erstellten Version der Variablen Row fort.

(Ich weiß, dass das nicht einfach ist!)

effel
Posts: 546
Joined: 16 Jan 2018, 13:34

Re: Array Dimensionen

Post by effel » 29 Apr 2021, 08:13

Vielen Dank, am Anfang waren es böhmische Zeichen für mich, wenn man die Funktion aber dann mal seziert, kommt das AHA

Post Reply

Return to “Ich brauche Hilfe”