operacje na tablicach w powershell są dość dziwnie rozwiązane. jak zwykle przy walce z najprostszymi [wydawałoby się] operacjami jest całkiem sporo zabawy. dla tego ciekawostka: jak dodać element do tablicy wielowymiarowej?

krótki scenariusz: dostaję dwuelementowe tablice wyników. chcę przechowywać je w dwuwymiarowej tablicy. czemu nie hashtable? ponieważ nie ma indexów i nie da się sprawdzić np. “3 elementu tablicy”.

deklaracja tablicy jest trywialna:

  • $multiarray=@() – definicja pustej tablicy, uniwersalne
  • $multiarray=(“abc”,”def”),(“ghi”,”jkl”),(“mno”,”prst”) – definicja z 3ma elementami

najpierw zajmę się drugim przypadkiem, bo działa prawidłowo i jest poprawną tablicą wielowymiarową:

>echo $multiarray[0]

abc
def

>echo $multiarray[1][1]

jkl

no i supa. teraz spróbujemy dodać kolejną tablicę … i tu zaczyna się robić dziwnie:

>$multiarray+=(“uwx”,”yz”)
>echo $multiarray[3]

uwx

>echo $multiarray[3][1]

w

he? o co c’mon? o fakt, iż tablice można mieszać – dodawać elementy różnych typów. wykonując dodanie +=(“uwx”,”yz”) de facto dodajemy dwa kolejne elementy do tablicy, będące jednowymiarowymi tablicami [po prostu stringami]. jak zatem dodać kolejną tablicę? spróbujmy tak:

>$multiarray+=@(“uwx”,”yz”)

eeee. WRONG! nadal dokładnie tak samo. aby dodać tablicę trzeba użyć takiej zupełnie intuicyjnej składni z przecinkiem (; pokażę od początq:

>$multiarray=(“abc”,”def”),(“ghi”,”jkl”),(“mno”,”prst”)
>$multiarray+=,(“uwx”,”yz”)
>$multiarray[3]

uwx
yz

>$multiarray[3][1]

yz

w końcu dobrze! w takim razie całe rozwiązanie będzie wyglądało tak:

>$multiarray=@()
>TUTAJ JAKIŚ LOOP
       $multiarray+=,($cos1,$cos2)

pozostaje jeszcze kilka innych ciekawostek o tablicach wielowymiarowych, o których trzeba wiedzieć:

podana przeze mnie definicja to ‘tablica tablic’ a nie stricte ‘tablica wielowymiarowa’. poprawny zapis tablicy wielowymiarowej to:

$multiarray=New-Object ‘object[,]’ 10,2 – definicja tablicy wielowymiarowej 1ox2

jednak operacje na takiej tablicy są trudniejsze – np. dodanie dwóch elementów wymagało by wykonania dwóch operacji – dla [x,0] i [x,1]. przy ‘tablicy tablic’ wystarczy +=,($x,$y) a więc jest łatwiej. dostanie się do komórek jest wtedy $multiarray[x,y] a nie jak przy ‘tablicy tablic’ $multiarray[x][y].

pozostaje kwestia wyświetlenia na ekran i tutaj kolejna niemiła niespodzianka: wspaniała funkcja Format-Table nie potrafi poradzić sobie z takimi tablicami. czy będzie to prawdziwa wielowymiarowa czy tablica tablic – będą one wyświetlane jako kolejne elementy ): niestety pozostają stare niedobre sposoby iteracji i formatowanie pojedynczych rzędów ): i znów dla ‘tablicy tablic’ operacja enumeracji jest prostsza:

>foreach($ma in $multiarray) { echo "$($ma[0]) -> $($ma[1])" }

abc -> def
ghi -> jkl
mno -> prst
uwx -> yz

eN.