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.
pawp
nExoR