# 配列

マニュアル > 画面作成ガイド > スクリプト > スクリプトの構文 > # 配列 |

配列について

SC2構文では配列を扱うことができます。配列とは、値の集合のことです。配列を使うと、例えば100個のデータがある場合、それを１つの変数でまとめて扱うことができます。大量のデータをまとめて処理したいときなどに利用します。

配列変数

配列変数の宣言

配列変数は下記のように宣言します。

例）100個の配列の例

    var a[100];				// 100個の配列の宣言

    a[0] = 123;				// 123を1番初めの要素として代入する
    a[1] = 234;				// 234を2番初めの要素として代入する
    …
    a[99] = 345; 				// 345を100番初めの要素として代入する
    var b = a[0] + a[1] ･･･ + a[99];	// 配列aの全要素を合計してbに代入する
    var d = ::Math.Sum(a);			// 配列aの全要素を合計してｄに代入する（Sum関数を使用した例）

| 配列要素の添え字（インデックス）は０から始まります。

| ::Math.Sumは合計値を求めるメソッドです。Mathオブジェクトには算術演算を行うための便利な関数がまとめられています。配列と組み合わせて利用する事によって、合計値、最大値、最小値、平均値などを簡単に求めることができます。

値の型の混在

配列では複数の値の型を混在させることができます。配列内で統一する必要はありません。

    a[0] = 123;
    a[1] = "hello";
    a[2] = T;

多次元配列変数

前述にて解説した配列変数「var a[100];」は、正確には1次元配列と呼びます。SC2構文では多次元配列も扱えるようになっており、配列の次元数には制限はありません。

多次元配列変数の宣言

多次元配列は下記のように宣言します。

例1）2次元配列(10 x 100個)の例

    var a[10,100];
    a[0, 0] = 1;		// 1を[0, 0]に代入する
    a[0, 1] = 2;		// 2を[0, 1]に代入する
    …
    a[9, 99] = 999;		// 999を[9, 99]に代入する
    var b = ::Math.Ave(a);	// 2次元目の要素の平均値を求めます（10個の1次元配列で返ってくる）

| 上記「var b = ::Math.Ave(a);」は、各列の平均値を１０個の１次元配列として一括で返してくれます。 つまり、 b[0] ･･･ a[0]の100行分のデータの平均 b[1] ･･･ a[1]の100行分のデータの平均 ：　　　：　　　： といった戻り値となります。

| 2次元配列はデータベースのテーブルのようなマトリックスとして考えるとイメージが浮かびやすいかもしれません。例えば「var a[10,100];」は10列、100行のテーブルとして考えることができます。なお、データベースを扱うコントロールから値を取得した場合、取得結果は2次元配列として扱われます。

例2）3次元配列(10 x 100 x 100個)の例

    var a[10, 100, 100];
    a[0, 0, 0] = 1;		// 1を[0, 0, 0]に代入する
    a[0, 0, 1] = 2;		// 2を[0, 0, 1]に代入する
    …
    a[9, 99, 99] = 99999;	// 99999を[9, 99, 99]に代入する
    var b = ::Math.Ave(a);	// aの3次元目の要素の平均値を求めます（10x100個の2次元配列で返ってくる）
    var d = ::Math.Ave(b);	// bの2次元目の要素の平均値を求めます（10個の1次元配列で返ってくる）
    var e = ::Math.Ave(d);	// dの1次元目の要素の平均値を求めます（1個の値として返ってくる）

キーワード「c」で配列を作成する

キーワード「c」を用いると、配列を簡単に作成することができます。

このキーワードの書式は下記のとおりです。

c([value1], [value2], …)

例）

    var a = c(1,2,3,4);			        //「var a[4]」と同意。各要素に「1,2,3,4」が代入される
    var a = c(1 + 2, 3 + 4, 4 + 5);		        // 計算式を含められます
    var a = c(::GetVal("TAG1"), ::GetVal("TAG2"));  // メソッドを含められます
    var a = c(T, 123, "Hello", #2005/1/1 0:0:0#);   // 異なるデータタイプの値を含められます

また、上記を組み合わせて多次元配列を作成することもできます。

例）

    var a = c(c(1,2), c(3,4), c(4,5));	             //「var a[3,2]」と同じ。a[0,0]は1、a[0,1]は2、a[2,1]は5。
    var a = c(c(c(1,2), c(3,4)), c(c(5,6), c(7,8)))	     //「var a[2, 2, 2]」と同じ。

| キーワード「c」はcombine（結合）の略です。

配列のインデックス

配列変数の宣言

配列の要素を取得するには[ ]の中に配列のインデックスを指定します。

インデックスは0から(要素数-1)までの数値です。

a[Index]

インデックスの指定方法には下記の方法があります。

1)インデックスに数値iを指定するとi番目の要素を取り出します。

2)インデックスにc(i, j, k, l, m….)を指定するとi, j, k, l, m…番目の要素を取り出します。i,j,k,l,m…は小さい順に指定する必要はありません。また、重複した値を指定することもできます。例）c(3,4,4,4,2,1,0)

3)インデックスに要素数と同じブール値の配列を指定すると、Tとなっている要素のみ抜き出します。

4)インデックスにi : j を指定すると、iからj番目の連続した要素を取り出します。

5)インデックスになにも指定しないと、全要素を取り出します。

上記の各指定方法について、「var a = c(1,2,3,4,5,6,7,8,9,10)」を元に考えると、

1)a[ 5 ] は先頭から６つ目の要素を返します。つまり6を返します。

2)a[ c(2, 5, 3) ] は先頭から3つ目、6つ目、4つ目の各要素を返します。つまりc(3,6,4)を返します。

3)a[ c(T, T, F, F, F, T, F, F, F, T) ] はTとなっている要素のみを抜き出します。つまりc(1,2,6,10)を返します。

4)a[ 2 : 5 ] は先頭から3つ目から6つ目までの連続した要素を返します。つまりc(3,4,5,6) を返します。

5)a[]は配列の全要素を返します。つまりc(1,2,3,4,5,6,7,8,9,10)をそのまま返します。

1次元配列のインデックス指定の応用例

上記の応用により、配列から指定した条件を満足する要素のみを抜き出す事ができます。

例）

    var a = c(1,2,3,4,5,6,7,8,9,10)
    var b = a[a > 6];

上記を実行すると、bには6以上の要素、つまりc(7,8,9,10)が代入されます。

a > 6 は c(F,F,F,F,F,F,T,T,T,T)を返し、結果としてa[c(F,F,F,F,F,F,T,T,T,T)]はc(7,8,9,10)を返すからです。

例）

    var a = c("タンク異常", "タンク正常", "タンク開", "ポンプ異常", "ポンプ正常", "ポンプ開")
    var b = a[::IsLike(a, "%異常%")];

上記を実行すると、"異常"の文字が含まれた要素、つまりc("タンク異常", "ポンプ異常")が代入されます。

::IsLike(a, "%異常%")はc(T,F,F,T,F,F)を返し、結果としてa[c(T,F,F,T,F,F)]はc("タンク異常", "ポンプ異常")を返すからです。

多次元配列のインデックス指定

配列の要素の値を取得するには[ ]の中に配列の各次元のインデックスを指定します。

a[Index1 , Index2, …]

インデックスの指定方法は1次元配列と同じです。

「var a = c(c(1,2), c(3,4), c(4,5))」 を元に考えると

1)a[2, 0] は、1次元目が先頭から3つ目、2次元目が先頭の要素、つまり4を返します。

2)a[2, ] は、1次元目が先頭から3つ目、2次元目は省略なので全要素、つまりc(4,5)を返します。

3)a[ , 1] は、1次元目は省略なので全要素、2次元目が先頭から2つ目の要素、つまりc(2,4,5)を返します。

4)a[ c(T, F, T), ] は、1次元目がTとなっている要素、2次元目は省略なので全要素、つまりc(c(1,2), c(4,5))を返します。

5)a[ 1 : 2, ] は1次元目が先頭から2つ目から3つ目の連続した要素、2次元目は省略なので全要素、つまりc(c(3,4), c(4,5))を返します。

多次元配列のインデックス指定

上記の応用により、以下のような比較による要素の抜き出しが可能です。

例）

    var a = c(c("Japan", "England", "France" , "China", "Singapore"), c("Asia", "Europ", "Europ", "Asia", "Asia"));
    var b = a[0, a[1, ] == "Asia"];

上記を実行すると、bには"Asia"の国だけ抜き出され、c("Japan", "China", "Singapore")が代入されます。理由は、a[1, ] == "Asia"は c(T,F,F,T,T)を返し、a[0, c(T,F,F,T,T)]はc("Japan", "China", "Singapore")を返す為です。

２次元配列をテーブルとして考えてみる

ここでは、2次元配列をデータベースのテーブルに見立てて、インデックスの応用を考えてみます。

1 | Test1 | T | 2005/1/1 12:30:00
2 | Test2 | F | 2005/1/1 14:25:00
3 | Test3 | T | 2005/1/1 15:15:00

例えば、上記のような３行4列のテーブルを、キーワード「c」を用いて表現すると下記の様になります。

    a = c(	c(1,2,3),
    	c(“Test1”,”Test2”,”Test3”),
    	c(T,F,T),
    	c(#2005/1/1 12:30:00#, #2005/1/1 14:25:00#, #2005/1/1 15:15:00#)   );

この例では、下記のようなインデックスの使い方が可能です。

1.a[0, ]は0列目、つまりc(1,2,3)になります。

2.::Math.Ave(a[0, ])は0列目の平均値、つまり2になります。

3.a[c(1,2), ]は1列目と2列目、結果は下記になります。

    c(c(“Test1”,”Test2”,”Test3”),
      c(T,F,T) );

4.a[c(1,1) , ]はいずれも1列目、結果は下記になります。

    c(c(T,F,T),
      c(T,F,T) );

5.a[ , a[3, ] > #2005/1/1 14:00:00#]は、「2005/1/1 14:00:00」以降のレコードを取得します。

    c(c(2,3),
      c(”Test2”,”Test3”),
      c(F,T),
      c(”#2005/1/1 14:25:00#”,”#2005/1/1 15:15:00#”) );

6.::Math.Ave(a[0 , a[3, ] > #2005/1/1 14:00:00#])は、「2005/1/1 14:00:00」以降のレコードの、0列目の平均値を求めます。つまりc(2,3)の平均値、結果は2.5になります。

| データベースからテーブルデータを取得したい場合は、「ダイレクトクエリーデータベースコントロール」もしくは「リモートクエリーデータベースコントロール」を参照して下さい。