Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 1 in /home/r5652521/public_html/soma-engineering.com/wp-content/themes/affinger/functions.php on line 1548
Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 1 in /home/r5652521/public_html/soma-engineering.com/wp-content/themes/affinger/functions.php on line 1548
Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 1 in /home/r5652521/public_html/soma-engineering.com/wp-content/themes/affinger/functions.php on line 1548
Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 1 in /home/r5652521/public_html/soma-engineering.com/wp-content/themes/affinger/functions.php on line 1548
Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 1 in /home/r5652521/public_html/soma-engineering.com/wp-content/themes/affinger/functions.php on line 1548
Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 1 in /home/r5652521/public_html/soma-engineering.com/wp-content/themes/affinger/functions.php on line 1548
Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 1 in /home/r5652521/public_html/soma-engineering.com/wp-content/themes/affinger/functions.php on line 1548
Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 1 in /home/r5652521/public_html/soma-engineering.com/wp-content/themes/affinger/functions.php on line 1548
こんにちは!そーまんです。
今回は、連想配列について書いてみました。
できるようになること
連想配列を使って配列と異なり、インデックス番号ではなく適切な添え字を入れることで添え字から名前を連想できるようにすることができます。
人の名前で言えばニックネームが添え字でそこから実際の名前を連想できるようなイメージだと思っていただければ分かりやすいかもしれません。
連想配列の概要
配列のキー(インデックス)が文字列となったものを連想配列といいます。
ちなみに配列について未だ知識がない方は以下の記事を見て頂けます参考になるかと思います。
復習になりますが、配列を作成した時に、キー(インデックス)は 0 から順に振られます。
配列のインデックスと値について(上がインデックスで下が値になります。)

配列ではインデックス番号と値の紐づけをしている一方で、連想配列では 以下の画像のように Value に対して Key を紐づけしています。
種類 | 特徴 |
---|---|
配列 | インデックス番号と値の紐づけ |
連想配列 | Value に対して Key を紐づけ |

それでは、どんな風に使うのか、イメージとして例を作成しました。
ここでは、住所と郵便番号が連想配列になっています。ここでは住所として東京都港区をキー (Key) とし、その住所の郵便番号として 105-0000 が値 (Value) としています。
つまり、文字のキーをもとにして値を設定した配列を連想配列と言います。住所と郵便番号を紐づけしているのです。

では、このイメージをもとに PowerShell で書いてみましょう。
連想配列の構文
連想配列の構文は以下のようになります。
キーと値を関連付ける為に =(イコール)を使用します。
1 2 3 4 5 6 7 |
$hash = @{ "key1" = "key1 の value" "key2" = "key2 の value" "key3" = "key3 の value" "key4" = "key4 の value" "key5" = "key5 の value" } |
連想配列のサンプルコード
では、先ほどの住所と郵便番号に置き換えてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$address_book = @{ "東京都港区" = "105-0000" "東京都中央区" = "105-0000" "東京都品川区" = "140-0000" "東京都千代田区" = "100-0000" "東京都新宿区" = "160-0000" } $address_book # 実行結果 $address_book Name Value ---- ----- 東京都千代田区 100-0000 東京都品川区 140-0000 東京都港区 105-0000 東京都中央区 105-0000 東京都新宿区 160-0000 |
これで、連想配列を作る事ができました。
連想配列のメソッド・プロパティ
それでは、連想配列に対してどんなメソッドやプロパティがあるのか見てみたいと思います。
例えばメソッドだと連想配列に追加 (Add)したり、数を数えたりする (count) 事ができ、またプロパティだと連想配列内にキーと値を追加する (IsFixedSize) 事ができるかなどが確認できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
$address_book | Get-Member # 実行結果 TypeName: System.Collections.Hashtable Name MemberType Definition ---- ---------- ---------- Add Method void Add(System.Object key, System.O... Clear Method void Clear(), void IDictionary.Clear() Clone Method System.Object Clone(), System.Object... Contains Method bool Contains(System.Object key), bo... ContainsKey Method bool ContainsKey(System.Object key) ContainsValue Method bool ContainsValue(System.Object value) CopyTo Method void CopyTo(array array, int arrayIn... Equals Method bool Equals(System.Object obj) GetEnumerator Method System.Collections.IDictionaryEnumer... GetHashCode Method int GetHashCode() GetObjectData Method void GetObjectData(System.Runtime.Se... GetType Method type GetType() OnDeserialization Method void OnDeserialization(System.Object... Remove Method void Remove(System.Object key), void... ToString Method string ToString() Item ParameterizedProperty System.Object Item(System.Object key... Count Property int Count {get;} IsFixedSize Property bool IsFixedSize {get;} IsReadOnly Property bool IsReadOnly {get;} IsSynchronized Property bool IsSynchronized {get;} Keys Property System.Collections.ICollection Keys ... SyncRoot Property System.Object SyncRoot {get;} Values Property System.Collections.ICollection Value... |
以降、先ほどの住所と郵便番号が入った状態の連想配列をそのまま使います。
数を数えたい時は count メソッドが使えます。
1 2 3 4 5 |
$address_book.count # 実行結果 5 |
連想配列からキーのみ取り出したい場合は keys メソッドが使えます。
1 2 3 4 5 6 7 8 9 |
$address_book.keys # 実行結果 東京都千代田区 東京都品川区 東京都港区 東京都中央区 東京都新宿区 |
値を取り出したい場合は values メソッドが使えます。
1 2 3 4 5 6 7 8 9 |
$address_book.values # 実行結果 100-0000 140-0000 105-0000 105-0000 160-0000 |
それでは特定のキーに対する値を取り出したい場合はどんな風に書くでしょうか。
簡単で、キーの名前を文字列で "(ダブルクォーテーション)で囲い、直接書けばいいだけです。東京都新宿区にあたる住所が表示されました。
1 2 3 4 5 |
$address_book."東京都新宿区" # 実行結果 160-0000 |
配列ではできませんでしたが、連想配列内にキーと値を追加する事ができるか確認してみます。IsFixedSize メソッドを使います。
返り値は False ですので、連想配列は Fix(固定)ではない。という事になります。
1 2 3 4 5 |
$address_book.IsFixedSize # 実行結果 False |
固定ではないのであれば、早速追加してみましょう。東京都渋谷区を追加してみます。
連想配列されましたね。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$address_book.Add("東京都渋谷区", "150-0000") $address_book # 実行結果 Name Value ---- ----- 東京都千代田区 100-0000 東京都品川区 140-0000 東京都港区 105-0000 東京都新宿区 160-0000 東京都中央区 105-0000 東京都渋谷区 150-0000 ← 追加されました。 |
連想配列のキーの表示を並び替えたい場合
郵便番号ではわかりにくいので、内容をサーバーに変更しました。
連想配列の後に .GetEumerator メソッドを使い、パイプさせて soft コマンドでプロパティである key を指定すると昇順に並べ替えることができます。恐らくこの方法が通常使われていると思います。降順にしたい場合は -Property key -Descending で可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$server_data = @{ "ip_192.168.100.101" = "server1" "ip_192.168.100.103" = "server3" "ip_192.168.100.102" = "server2" } $server_data = $server_data.GetEnumerator() | sort -Property key foreach($item in $server_data){ $key = $item.Key; $value = $item.Value; Write-Host ('キー:' + $key + ' → 値:' + $value); } # 実行結果 キー:ip_192.168.100.101 → 値:server1 キー:ip_192.168.100.102 → 値:server2 キー:ip_192.168.100.103 → 値:server3 |
こんなこともできますよという意味で、他にも簡単に並べ替える場合は [ordered] 属性をつけてあげると並べ替えることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[hashtable]$server_data = [ordered]@{ "ip_192.168.100.101" = "server1" "ip_192.168.100.103" = "server3" "ip_192.168.100.102" = "server2" } $server_data # 実行結果(server2 と server3 の表示の並びが入れ替わっています。) Name Value ---- ----- ip_192.168.100.101 server1 ip_192.168.100.102 server2 ip_192.168.100.103 server3 |
連想配列のキーに対して、複数の値を指定したい場合
連想配列のキーに対して複数の値をしているすることもできます。波カッコで括って ; (セミコロン) で区切ってあげればできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$server_data = @{ "Active Directory" = @{"OS" = "Windows Server"; "Version" = "2016"}; "Application Server" = @{"OS" = "Redhat Linux"; "Version" = "7.2"}; "Web Server" = @{"OS" = "CentOS"; "Version" = "6.5"}; } $server_data["Active Directory"]; # 実行結果 Name Value ---- ----- OS Windows Server Version 2016 |
最後に
いかがでしょうか。
連想配列が使えるようになってくると書ける処理内容がより高度になってくるかと思います。
では最後までお読みいただきありがとうございました!