[Part.4]多段階配列と多次元配列を簡単解説

[myphp1 file=”SR-array-biginner”]

こんにちは。チェシャ男です。(-皿-)

本連載「PowerShell で配列デビュー」では、入門者向けに配列について解説しています。

第3回までの記事で、配列の宣言から値の変更まで配列の基礎となる部分については解説しました。

今回の内容は、少し応用的な

多段階配列と多次元配列

について説明します。混同しやすい2つの配列ですが、しっかりと使い分けられるとベテランの仲間入りですね。

解説用にわかりやすく書くため、正確ではない表現で書かれている場合があります。その点はご了承ください。

多段階配列とは

多段階配列は、別名ジャグ配列とも言います。

多段階配列とは、

配列の要素が別の配列になっている配列

の事を指します。

多段階配列(ジャグ配列)の中身

多段階配列は配列の要素部分も配列になっているという状態です。言葉で説明されてもなかなか分かりにくいかもしれません。

恒例の好きな食べ物シリーズで説明してみます。

連想配列の説明時のチェシャ男の好きな食べ物を思い出してみてください。

  1. 好きな食べ物 の 麺類 は つけ麺 で 野菜 は 玉ねぎ で 肉料理 は から揚げ

ご覧のように、”麺類”、”野菜”、”肉料理”と料理のジャンルを連想配列のキーとして使っていました。

チェシャ男は、”麺類”の中で「つけ麺」以外にも「坦々麺」が好きです。”野菜”でも「キャベツ」や「ナス」も好きなんです。

そうすると、各料理のジャンルによって配列が作れますよね。

  1. 好きな”麺類” は つけ麺 と 坦々麺
  2. 好きな”野菜” は 玉ねぎ と キャベツ と ナス
  3. 好きな”肉料理” は から揚げ と ステーキ

これは、それぞれ一次元配列で表すことができると思います。

  1. $好きな麺類 = @(つけ麺 , 坦々麺 )
  2. $好きな野菜 = @(玉ねぎ , キャベツ , ナス)
  3. $好きな肉料理 = @(から揚げ , ステーキ)

すると、最初に答えた好きな食べ物は以下のように表現が変わります。

  1. 好きな食べ物 は 麺類 と 野菜 と 肉料理
  2. $好きな食べ物 = @( $好きな麺類 ,$好きな野菜 ,$好きな肉料理)
  3. $好きな食べ物 = @( @(つけ麺,坦々麺) , @(玉ねぎ,キャベツ,ナス) , @(から揚げ,ステーキ) )

配列の中に別の配列が入り込んでいることがわかりますね。これが多段階配列です。

多段階配列を無理やり図で表すとこんな感じでしょうか。

多段階配列のイメージ-チェシャわら

このように多段階配列階層的な構造なんですね。

PowerShell で多段階配列を使ってみる

それでは、多段階配列を PowerShell 上で確認してみましょう。

PS C:\> #麺類の配列
PS C:\> $men = @("つけ麺","坦々麺")

PS C:\> #野菜の配列
PS C:\> $yasai = @("玉ねぎ","キャベツ","ナス")

PS C:\> #肉料理の配列
PS C:\> $niku = @("から揚げ","ステーキ")

PS C:\> #好きな食べ物
PS C:\> $food = @($mem,$yasai,$niku)

PS C:\> #好きな食べ物を表示してみる
PS C:\> $food
つけ麺
坦々麺
玉ねぎ
キャベツ
ナス
から揚げ
ステーキ

宣言方法は特に難しくありませんね。配列の作成と格納は同時に行うこともできます。

PS C:\> #宣言しながら格納する
PS C:\> $array1 = @(@(1,2),@("a","b","c"),@(3,4))
PS C:\> $array1
1
2
a
b
c
3
4

配列の要素を参照してみましょう。

PS C:\> $food[0]
つけ麺
坦々麺

PS C:\> $food[1]
玉ねぎ
キャベツ
ナス

一番外側の配列 ($food) から見た要素は、それぞれの料理ジャンルの配列なので上の実行結果のようにジャンル毎の配列の要素が表示されます。

つまり、

好きな食べ物の1つ目の要素 = 好きな麺類の配列

→$food[0] = $men

という関係があります。このことから、さらに配列の要素の要素を参照する場合は

PS C:\> $food[0]
つけ麺
坦々麺

PS C:\> $food[0][0]
つけ麺

PS C:\> #$food[0]を一つの配列として考えることができる
PS C:\> ($food[0])[1]
坦々麺

といったように、インデックス(添字)のインデックス(添字)を指定するという直感的な呼び出し方で参照することができます。

$配列[インデックス1][インデックス2] = 要素

※インデックス1は大きな配列要素、インデックス2は中身の配列要素

といった参照方法ですね。

多次元配列とは

次に説明するのは多次元配列です。

多次元配列は、多段階配列よりも理解しづらいかもしれません。

多次元配列の構造

多次元配列では、配列の要素がマス目状に格納されています。

イメージとしては、エクセルやスプレッドシートのような表状の領域に要素が格納されています。配列の宣言時に表を用意するようなものですね。

またまた、好きな食べ物シリーズで解説します。多次元配列は文字では表現しにくいので、初めから図で説明しますね。

好きな食べ物配列として、3×3の要素を持った多次元配列があるとします。

それぞれの要素は、

1列目 -> つけ麺 , 坦々麺

2列目 -> 玉ねぎ , キャベツ , ナス

3列目 -> から揚げ , ステーキ

として、列には「料理のジャンル」、行に「好きな順でが格納された場合の配列は

多次元配列のイメージ-チェシャわら

のようになります。エクセルで表を作っている時と同じですね。

要素を参照する場合も行と列を指定する要領です。

  1. 好きな食べ物 で 麺類 で 1番好き な 料理 は つけ麺
  2. 好きな食べ物配列 の 麺類(列) で 1番好きな物(行) の 料理 は つけ麺
  3. $好きな食べ物配列[ 麺類1番好き ]  = つけ麺

ただし、

多次元配列は”連想配列”とは違い要素に対してインデックス番号(添字)が割り当てられており、インデックスを指定して参照します。

$好きな食べ物配列[ 麺類 , 1番好き ]  = つけ麺

→ $好きな食べ物配列[ 1行目, 1列目 ]  = つけ麺

→ $好きな食べ物配列[ 0, 0 ]  = つけ麺 (※インデックス番号は”0”スタート)

PowerShell で多次元配列を使ってみる

それでは、多次元配列を PowerShell 上で確認してみましょう。

PS C:\> #3*3の配列を宣言
PS C:\> $food2 = New-Object "System.Object[,]"3,3

PS C:\> $food2[0,0] = "つけ麺"
PS C:\> $food2[0,1] = "坦々麺"
PS C:\> $food2[1,0] = "玉ねぎ"
PS C:\> $food2[1,1] = "キャベツ"
PS C:\> $food2[1,2] = "ナス"
PS C:\> $food2[2,0] = "から揚げ"
PS C:\> $food2[2,1] = "ステーキ"

PS C:\> #好きな食べ物を表示してみる
PS C:\> $food2
つけ麺
坦々麺
玉ねぎ
キャベツ
ナス
から揚げ
ステーキ

宣言方法が少し難しいですね。これまでとは大きく異なり、

  1. New-Object コマンドレットでオブジェクトの生成宣言
  2. 型の指定
  3. 要素範囲の設定

という3ステップが必要になります。配列の要素を参照する場合は、

PS C:\> $food2[0,0]
つけ麺
PS C:\> $food2[(2,0),(2,1)]
から揚げ
ステーキ

という風に、インデックスを[行,列]で指定する必要があります。

$変数[インデックス1 , インデックス2] = 要素

※インデックス1は列番号、インデックス2は行番号

ですね。また、

今回の配列では3*3の要素を指定したものの、インデックス(0,2)(2,2)は空の要素であることがわかります。

PS C:\> $food2[0,2]
PS C:\>

PS C:\> $food2[2,2]
PS C:\>

多次元配列の参照方法は少し難しかったでしょうか?

多段階配列と多次元配列の違い

今回解説した配列は、”二段階配列”と”二次元配列”です。

段階数と次元数の決まり方は?

多段階配列の段階数は、”$food[*][*]”で参照したように

要素指定時に”[]”が連続できる数

に言い換えることができます。

多次元配列の次元数は、”food2[*,*]”で参照したように

要素指定時に”*”を連続させなければならない数

に言い換えられます。似ているようで、違うものなんですね。

多段階配列の要素数は、多次元配列の要素数より少ない

各配列の要素数にも違いがあります。

多段階配列では、別の配列が要素として格納されていることから実質的な要素数は

それぞれの配列の要素数の和

です。

一方、多次元配列の要素数は宣言時に指定した

行の要素数と列の要素数の積

で決まります。

PS C:\> #各要素数を足し合わせる
PS C:\> $food[0].Length+$food[1].Length+$food[2].Length
7
PS C:\>
PS C:\> #要素数は積である
PS C:\> $food2.Length
9

多次元配列では宣言時に要素数分の領域が用意されるのに対し、多段階配列では格納した配列の要素数分だけの領域しか確保されません。

時と場合によると思いますが、メモリの事を考えると必要な領域だけ確保できる多段階配列の方が良さそうですね。

本連載「PowerShellで配列デビュー」は、第4回で終了(予定)です。これであなたも配列ビギナー卒業です!

お読み頂きありがとうございます。第3回までをお読みでない方は、是非ご覧ください!

チェシャ男おススメ!PowerShell入門者の必携本 (-皿-)

本記事をお読みくださったあなたに、チェシャ男が実際にPowerShellの勉強に使っているイチ押しの書籍を紹介します!

こちらの書籍ではリファレンス情報だけではなく、PowerShellの基礎知識基本文法など約700ページにわたって解説しています!
初心者の場合、ネットでふらふらと情報を漁るよりは効率よく勉強ができると思いますよ!

本サイトでのPowershell学習のお供に是非ご活用ください(*´皿`*)

疑問点等ございましたらお気軽にコメントください!

[myphp1 file=”SR-array-biginner”]

コメントを残す

メールアドレスが公開されることはありません。