こんにちは。チェシャ男です。(-皿-)
本連載「PowerShell で配列デビュー」では、入門者向けに配列について解説します。
第1回では(一次元)配列について、第2回では連想配列(ハッシュテーブル)について、それぞれ解説しました。
ここまで解説した内容で、配列の宣言方法と参照の方法のは理解できたと思います。第3回では、これらをもう少し応用して、要素の変更や追加・削除を学んでいきましょう。
もくじ
一次元配列の操作
一次元配列の操作は特に難しいことはなく、要素の参照時と同様に”添字(インデックス)”を指定して行います。
また、”+ (プラス演算子)“を使うことで配列の結合も可能です。
配列の要素の値を変更する
配列の要素を変更する場合は、添字を用いて要素を参照し
“= (代入演算子)“
を使って値を変更します。
変更する → 新しい値を代入する
という考え方ですね。あなたが変数の操作ができるなら同じようなものだと思ってください。
PS C:\> #配列を宣言 PS C:\> $array1 = @(1,2,3,4,5) PS C:\> #1番目の要素(添え字は"0")を参照 PS C:\> $array1[0] 1 PS C:\>#先頭の要素を10に変更 PS C:\> $array1[0] = 10 PS C:\> PS C:\> $array1[0] 10 PS C:\> #配列の中身をすべて見る PS C:\> $array1 10 2 3 4 5
配列の要素を削除する場合は、”$null” を代入しましょう。
ただし、あくまでも指定した要素を削除するだけです。一次元配列は固定長の配列、つまり大きさが変わらない配列なので、大きさ(要素数)が変わったりインデックス番号(添字)が繰り上がることはありません。
PS C:\> #配列を宣言 PS C:\> $array2 = @(1,2,3,4,5) PS C:\> #配列の大きさ(長さ)を表示 PS C:\> $array2.Count 5 PS C:\> #1番目の要素にnullを代入 PS C:\> $array2[0] = $null PS C:\> #配列を確認 PS C:\> $array2 2 3 4 5 PS C:\>#配列の大きさは変わらない PS C:\> $array2.Count 5 PS C:\>#"0"盤目を見てみても何もないだけ。 PS C:\> $array2[0] PS C:\>
どうでしょうか。基本的な代入による変更方法はわかりましたか?
配列の要素に新しい値を追加する
要素に新しい値を追加は、”+= 演算子” を使う方法です。
PS C:\> #配列を宣言 PS C:\> $array3 = @(1,2,3) PS C:\> #配列を確認 PS C:\> $array3 1 2 3 PS C:\> #新しい要素を追加する PS C:\> $array3 += 4 PS C:\> #要素が追加されている PS C:\> $array3 1 2 3 4
1つ注意点として、覚えておいてください。”+=” 演算子による配列の追加は
要素の追加に伴い、配列を再構成する
という挙動を取ります。(入門時点では特に気にする必要はないかもしれませんが…)
先ほども述べたように基本的に一次元配列は固定長なので、大きさが変わるときはもう一度配列を作り直しているんですね。大量の要素を追加する場合などは、かなり処理時間を必要としますので注意してください。
配列と配列を結合する
”+ (プラス演算子)”を用いることで、配列と配列を結合することができます。配列の結合というのは、
配列1(1,2,3) + 配列2(4,5,6) => 配列3(1,2,3,4,5,6)
のように、結合される側(配列1)の要素の後に結合する側(配列2)の要素がくっついた、新しい配列(配列3)を作ることを指します。
PS C:\> #結合される側の配列を宣言 PS C:\> $array4 = @(1,2,3) PS C:\> #結合する側の配列を宣言 PS C:\> $array5 = @(4,5,6) PS C:\> #配列を結合 PS C:\> $array6 = $array4 + $array5 PS C:\> #配列を確認 PS C:\> $array6 1 2 3 4 5 6
このように2つの配列を結合することができます。
配列のメソッドやプロパティ使ってみる
演算子による方法だけではなくメソッドを使用することもできます。
「メソッドって何?」という場合や「どんなメソッドやプロパティが用意されているの」という場合は、Get-Memberコマンドレットのページで確認し知らべてみてください。
まずは、配列の ”SetValue” メソッドを使用して値を変更します。
$配列.SetValue( <変更する値> , <インデックス番号> )
→配列の<インデックス番号>番目を<変更する値>に変更する
注意する点は、”添字”を指定するため ”0” 番目からカウントする点です。
PS C:\> #配列を宣言 PS C:\> $array7 = @("a","b","c","d") PS C:\> #配列を確認 PS C:\> $array7[1] b PS C:\> #インデックス番号が1(配列の2番目の要素)を"x"に変更 PS C:\> $array7.SetValue("x",1) PS C:\> #配列を確認 PS C:\> $array7[1] a x c d
他には、”Add” メソッドなどがあります。
$配列.Add( <追加する要素> )
という使い方をします。
しかし、以下の実行結果を見るとわかるように配列は固定長です。よって、メソッドによる要素の追加ができないためエラーが起きてしまいます。
PS C:\>#Addで要素を追加してみる PS C:\> $array7.Add("e") Exception calling "Add" with "1" argument(s): "コレクションは固定サイズです。" At line:1 char:1 + $array7.Add("e") + ~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : NotSupportedException
さらには、”Count” プロパティで大きさ(要素の数)を求めたり、”Clear” メソッドで要素を初期化することも可能です。色々試して覚えてみることをおススメします。
連想配列(ハッシュテーブル)の操作
連想配列の操作は慣れてくると直感的な操作が可能で非常に扱いやすいですが、初めて触ると場合は少し戸惑うかもしれません。
しかし、基本的な考え方は一次元配列と同じです。要素と値の関係をキーとバリューに置き換えて考えることが大切です。
連想配列の要素の値を変更する
連想配列名(変数名)と変更を加える要素のキー(名前)を指定することで値を変更します。
“. (ドット演算子)“を用いた参照方法でも、”[] (角かっこ)“による参照方法でも変更は可能です。
PS C:\> #配列を宣言 PS C:\> $hash1 = @{No1 = "a";No2 = "b";No3 = "c"} PS C:\> $hash1.No1 a PS C:\> #"No1"を指定して値を変更する PS C:\> $hash1.No1 = "x" PS C:\> #変更を確認 PS C:\> $hash1.No1 x PS C:\> #"No2"を指定して値を変更する PS C:\> $hash1["No2"] = "y" PS C:\> #変更を確認 PS C:\> $hash1.No2 y PS C:\> $hash1 Name Value ---- ----- No1 x No2 y No3 c
連想配列の要素に新しい値を追加する
値を追加する場合は、連想配列名(変数名)に新しく追加する要素のキー(名前)と値を指定します。
“. (ドット演算子)“を用いた参照方法でも、”[] (角かっこ)“による参照方法でも変更は可能です。
PS C:\> #配列を宣言 PS C:\> $hash2 = @{No1 = "a";No2 = "b";No3 = "c"} PS C:\> #"."を用いて、値を追加する PS C:\> $hash2.No4 = "d" PS C:\> #”[]”を用いて、値を追加する PS C:\> $hash2["No5"] = "f" PS C:\> $hash2 Name Value ---- ----- No1 a No4 d No3 c No2 b No5 f
”Add” メソッドで要素に値を追加する
一次元配列(Collections.Array)では ”Add” メソッドによる追加ができませんでしたが、連想配列(Collections.Hashtable)では可能です。
$配列名.Add(“キー名“, “追加する値“)
を指定します。
PS C:\> #配列を宣言 PS C:\> $hash3 = @{No1 = "a";No2 = "b";No3 = "c"} PS C:\>#キー名”No4”を”d”として追加する PS C:\> $hash3.Add("No4", "d") PS C:\> $hash3 Name Value ---- ----- No1 a No4 d No3 c No2 b
ちなみに、既に存在するキーに対して ”Add” しようとすると、下記のようにエラーが表示されます。
PS C:\>#存在する”No3"に追加しようとする PS C:\> $hash3.Add("No3", "x") Exception calling "Add" with "2" argument(s): "項目は既に追加されています。辞書のキー: 'No3' 追加 されるキー: 'No3'" At line:1 char:1 + $hash3.Add("No3", "x") + ~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : ArgumentException
”Remove” メソッドで要素を削除する
”Remove” メソッドを用いることで、指定した要素を削除します。使い方は簡単で、
$配列名.Remove(“キー名“)
のように、キー名(名前)を指定するだけです。
PS C:\> #配列を宣言 PS C:\> $hash4 = @{No1 = "a";No2 = "b";No3 = "c"} PS C:\> #削除前の要素数 PS C:\> $hash4.Count 3 PS C:\> #要素を削除 PS C:\> $hash4.Remove("No3") PS C:\> $hash4 Name Value ---- ----- No1 a No2 b PS C:\>#削除後の要素数 PS C:\> $hash4.Count 2
実行結果を見て一次元配列との大きな違いに気づきましたか?
要素を削除したら、配列の大きさが変わっている
という大きな違いがあるんです!連想配列は固定長の配列ではないため、要素が削除されればその分大きさが小さくなるんですね。
”Contains”メソッドで要素の存在を確認する
”Contains” メソッドを使用することで、指定したキー名に対する値が存在するかを確認することができます。
存在を事前に確認することで、”Add” メソッドのエラーを回避するなんてことができますね、
$配列名.Contains(“キー名“)
のように、キー名(名前)を指定するだけです。
PS C:\> #配列を宣言 PS C:\> $hash5 = @{No1 = "a";No2 = "b";No3 = "c"} PS C:\> #存在する PS C:\> $hash5.Contains("No1") True PS C:\> #存在しない PS C:\> $hash5.Contains("No5") False
ここまで紹介した3回の記事で、あなたは PowerShell における配列の基礎を身に着けることが(きっと)できました。配列ビギナーはこれで卒業ですね。
次回、第4回は補足として「多段階配列と多次元配列」についてご紹介します。お楽しみに!
チェシャ男おススメ!PowerShell 入門者の必携本 (-皿-)
本記事をお読みくださったあなたに、チェシャ男が実際に PowerShell の勉強に使っているイチ押しの書籍を紹介します!
こちらの書籍ではリファレンス情報だけではなく、PowerShell の基礎知識や基本文法など約700ページにわたって解説しています!
初心者の場合、ネットでふらふらと情報を漁るよりは効率よく勉強ができると思いますよ!
本サイトでの Powershell 学習のお供に是非ご活用ください(*´皿`*)
疑問点等ございましたらお気軽にコメントください!
[myphp1 file=”SR-array-biginner”]