配列

配列は値のグループを保持するデータ構造です。配列は、似たような型のアイテムのリストがある場合に役立ちます。例えば、市外局番、電話番号、顧客名のリストなどです。

Studioで使用できる配列には2種類あります。

  • 文字列配列:変数内にパイプで区切られて文字列が入っています。英数字からなる文字列値を保持します。
  • ダイナミック配列:ダイナミックデータオブジェクトに格納される配列です。

データが1つのエンティティに関するすべての異なるタイプの情報で構成されるリストを扱う場合、データ構造としてはダイナミックデータオブジェクト を使用するのがより適切です。配列とオブジェクトの比較は、データ構造ヘルプページを参照してください。

配列に関する重要ポイント

  • 配列には少なくとも2つの要素が必要です。要素が1つしかない配列は通常の変数のように見えます。配列であることに変わりはないので、配列として呼び出すことができます。同じことがダイナミック配列にも当てはまります。
  • Studioでは、配列のインデックスは1から始まります。

  • index()indexof()のように、一部の関数は配列で使用できます

  • 文字列配列では、任意の区切り文字を使用できます。しかし、文字列配列をネイティブに読み込むには、区切り文字としてパイプ文字を使用する必要があります。

試してみる

Array Examplesスクリプトダウンロードし、Studioにインポートします。このヘルプページの例の多くは、サンプルスクリプトのSnippetアクションで利用できます。スニペットエディターウィンドウを開き、デバッガーを実行して例を確認できます。

配列構文のサマリー

文字列配列は以下のいずれかの構文で作成します。

インデックスを使って各要素に値を代入する:

ASSIGN <var>[<index1>] = "<value1>"

ASSIGN <var>[<index2>] = "<value2>"

ASSIGN <var>[<index3>] = "<value3>"

パイプ区切りの文字列としてすべての要素の値を変数に代入する:

ASSIGN <var> = "<value1> | <value2> | <value3>"

以下の構文でダイナミック配列を作成する:

DYNAMIC <object>

ASSIGN <object>.<member>[<index>].<sub-member>= "value"

ダイナミック配列の追加のフォームがサポートされます。

文字列配列の特定の要素を参照するには、次の構文を使います:

<var>[index]

ダイナミック配列の特定の要素を参照するには、次の構文を使います:

ASSIGN <var> = <object>.<member>[<index>].<arrayElement>

要素とインデックス

配列が保持する値を要素と呼びます。スクリプトは、配列内の要素の順序を追跡します。配列の各要素には、インデックス番号と呼ばれる数値の識別子があります。インデックスは、配列内の位置に基づいて各要素に自動的に割り当てられます。要素を並べ替えたり、追加したり、削除したりすると、そのインデックスが変わることがあります。

Studioでは、配列のインデックスは1から始まります。インデックスは正の整数でなければなりませn。配列の特定の要素を操作するには、インデックスが必要です。要素のインデックスがわからない場合、indexof()関数を使って求めることができます。

文字列配列の各要素の参照

文字列配列の個々の要素を参照するには、次の構文を使います:<配列要素>[<インデックス>]。この構文は等号のどちら側でも使えます。例えば、別の変数に値を代入するときなど、要素に値を代入したり、要素の値を参照したりするのに使用できます。

例:

ASSIGN heroes[1] = "Beowulf"
ASSIGN heroes[2] = "Sir Gawain" 
ASSIGN heroes[3] = "Byrhtnoth"

この例では、ベオウルフのインデックスは1、ガウェイン卿のインデックスは2、バートノートのインデックスです。これらの要素は、パイプで区切られた形式で配列を見た場合は同じインデックスを持っています:name = "Beowulf|Sir Gawain|Byrhtnoth"。この形式で配列のインデックスを決定するには、要素を左から右へ、1から順に数えます。

インデックスは数値順に指定される

インデックスは数値順に1つずつ埋められていきます。現在配列に存在しないインデックスを参照した場合、スクリプトはそのインデックスを作成し、値を代入しない限り、そのインデックスは空になります。スクリプトは、ユーザーが参照するインデックスと、配列の前の最後の要素の間に、存在しないインデックスを作成します。スクリプトがインデックスを埋めるために追加する要素は空になります。例:

ASSIGN heroes = "Beowulf|Sir Gawain|Byrhtnoth" 
ASSIGN heroes[6] = "Lancelot"

結果の配列はheroes = "Beowulf|Sir Gawain|Byrhtnoth|||Lancelot"です。スクリプトはインデックス4と5の要素を追加しますが、値が割り当てられていないため、空になっています。

同様に、存在しない要素から値を引き出そうとすると、その要素が作成されます。参照しようとした要素と、前の最後の要素との間のすべての要素も作成され、これらは空になります。

数値が必要なコンテキストで空の配列要素を使用すると、スクリプトはその値がゼロであるかのように動作します。

次の未使用インデックスの決定

配列に不要な空要素が作成されるのを避けるため、次の未使用インデックスを決定することができます。これには配列の要素を数え、その数に1を加えます。すると使用可能な次のインデックス番号がわかります。

これには、size()関数を使用します。例:

ASSIGN heroes = "Beowulf|Sir Gawain|Byrhtnoth"  
ASSIGN nextIndex = heroes.size() + 1
ASSIGN heroes[nextIndex] = Roland

この例では、heroes.size()が配列内の要素数を返します。totalNamesの値は3です。これに1を加え、nextIndex変数をインデックス番号の代わりに使うことで、配列に要素を追加することができます。

count()関数を使用することもできます。

文字列配列

文字列配列を定義する方法は2つあります。1つ目は、各要素にそれぞれ明示的に名前を付ける方法です。次の例は、要素ごとに定義されたテキスト値を含む文字列配列です。

ASSIGN heroes[1] = "Beowulf"
ASSIGN heroes[2] = "Sir Gawain" 
ASSIGN heroes[3] = "Byrhtnoth"

配列名の後の角括弧内の数字は、要素のインデックス番号です。これは各要素の識別子です。

文字列配列を定義する2つ目の方法は、各要素の間に1つのパイプ文字(|)を使ってパイプ区切りの文字列を定義する方法です。この例では、最初の例の配列をパイプ区切りの文字列として定義しています。パイプ区切りの文字列配列を作成する場合、ステートメントの右側の値を二重引用符で囲む必要があります。

ASSIGN heroes = "Beowulf|Sir Gawain|Byrhtnoth"

この2つの方法に機能の違いはなく、同じように使用できます。どちらの方法で文字列配列を定義しても結果は同じで、要素の配列を含む変数が得られます。

文字列配列を宣言する際に、ASSIGNキーワードを使用する必要はありません。ただし、使用すると便利です。ASSIGNを含めると、スクリプト内で配列を導入した場所を、高度な検索を使用して簡単に見つけることができます。ASSIGNを使用しない場合は、配列の名前を検索する必要があります。検索結果には、スクリプト内の配列へのすべての参照が含まれます。検索語にASSIGNを含めると、その変数が明示的に代入されている結果のみが返されます。ASSIGNを使わずに変数を宣言するには、次の構文を使用します:<name> = "<value>"

ダイナミック配列

ダイナミック配列にはいくつかの形式があります。

  • ダイナミックデータオブジェクトには、パラメーターを含める必要があります。配列の各要素はオブジェクトのメンバーでもあります。

    DYNAMIC beowulfLocations 
    ASSIGN beowulfLocations[1] = "Land of the Geats"
    ASSIGN beowulfLocations[2] = "Heorot" 
    ASSIGN beowulfLocations[3] = "Earnanæs"
  • ダイナミックオブジェクトには、配列を保持するメンバーが含まれます。オブジェクトのその他のメンバーは、文字列や数値を保持したり、他の配列にすることもできます。

    DYNAMIC beowulfCharacteristics 
    ASSIGN beowulfCharacteristics.foe[1].characteristics[1] = "Grendel"
    ASSIGN beowulfCharacteristics.foe[1].characteristics[2] = "son of Cain"
    ASSIGN beowulfCharacteristics.foe[2] = $"Grendel\'s mother" 
    ASSIGN beowulfCharacteristics.foe[3] = "Dragon"
  • 文字列配列は、それぞれがダイナミックデータオブジェクトを含む要素を保持します。

    DYNAMIC epicPoems
    ASSIGN epicPoems.poemName = "Beowulf"
    DYNAMIC heroes 
    ASSIGN heroes.heroName = "Beowulf"
    DYNAMIC monsters
    ASSIGN monsters.monsterName = "Grendel"
    ASSIGN oldEnglish[1] = epicPoems
    ASSIGN oldEnglish[2] = heroes
    ASSIGN oldEnglish[3] = monsters

    デバッガーを実行すると、スニペットエディターウィンドウの変数ツリータブで、ダイナミックオブジェクトと文字列配列の内容を表示することができます。

    APIに接続する場合など、スクリプトが他のシステムと連動する必要がある場合は、このタイプのダイナミック配列は使用できません。文字列配列が保持するデータをシリアル化したり、JSONやXML文字列に変換したりすることはできません。

場所による配列要素の参照

文字列配列やダイナミック配列の要素を参照するには、インデックスで指定される配列内の位置を使用します。例:

ASSIGN heroes = "Beowulf|Sir Gawain|Byrhtnoth"
ASSIGN currentName = heroes[2]

currentNameの値はSir Gawainです。

ASSIGNステートメントの等号の両側で、インデックス番号の代わりに変数を使うことができます。これにより、スクリプトにインデックスをハードコードすることなく、特定のインデックスを参照することが可能です。例:

ASSIGN heroes = "Beowulf|Sir Gawain|Byrhtnoth"
ASSIGN location = 2
ASSIGN currentHero = heroes[location]
ASSIGN nextIndex = heroes.count() + 1
ASSIGN heroes[nextIndex] = "Roland"

この例では、currentHeroの値はSir Gawainです。上記の例の最後の2行は、ASSIGNステートメントの左辺でインデックスとして変数を使用しています。また、count()関数を使って配列の要素数を返す方法も示しています。この情報は、次の空のインデックスに新しい要素を追加するために使われます。

インデックス番号に変数を使う場合、変数名の周りに中括弧を使う必要はありません。スクリプトは、配列名の角括弧の間に数値が入ることを期待しています。そして数字でないものは変数であると仮定し、その名前の変数を探します。対応する変数宣言があり、そこに数値を代入できるはずです。それがない場合、次のエラーが発生します:

_ERR=In Snippet line 12: Array index must be >= 1

Snippet アクションのErrorブランチが接続されている場合、このエラーが発生するとスクリプトはそのブランチをたどります。

文字列配列でFOREACHを使う

各要素を繰り返し処理するために、文字列配列でFOREACHステートメントを使うことができます。

ASSIGN heroes = "Beowulf|Sir Gawain|Byrhtnoth|Lancelot"
 FOREACH elem IN heroes 
{
   ASSIGN aName = elem 
}

この例では、elemaNameが反復ごとに更新されます。変数elemは、FOREACHループが処理している現在の要素を保持します。スクリプトはelemの内容でaNameを更新します。各反復の終わりには、elemaNameは同じ値を保持しますが、反復の途中では、elemは新しい値を保持し、aNameは古い値を保持します(初期反復の開始時には値がありません)。

このことは、Array ExamplesスクリプトFOREACH Loop with a String Array スニペットによく示されています。変数の更新方法を見るには、スニペットを1行ずつステップスルーします。

文字列配列でFORを使う

文字列配列でFORループを使うと、配列を繰り返し処理し、定義されたアクションを指定の回数実行することができます。

ASSIGN heroes = "Beowulf|Sir Gawain|Byrhtnoth|Lancelot"
FOR i = 1 TO heroes.count 
   {    
      item = "{heroes[i]}" 
   } 
        

この例の結果、FORループの各反復において、heroes配列のiの値で指定されたインデックス位置にある内容でItemが更新されます。FORループは、heroes.countで示されるように、文字列配列の末尾に達すると反復を停止します。

このループは、Array ExamplesスクリプトFOR Loop with a String Arrayスニペットで確認できます。

関数を配列と一緒に使う

関数 を配列と一緒に使用できます。配列名と角括弧で囲まれたインデックスを使用し、ドット表記法で関数名を加えます。次にこの例を示します。


ASSIGN heroes = "Beowulf|Sir Gawain|Byrhtnoth"
ASSIGN miniHero = "{heroes[2].lower}"
ASSIGN yellyHero = "{heroes[2].upper}"

この例の結果はminiHero = sir gawainyellyHero = SIR GAWAINです。

すべての関数ですべての配列を使用できるわけではありません。特定の種類の値でしか動作しない関数もあります。使用したい関数がサポートする値の種類を確認してください。

関数をダイナミック配列と一緒に使用できます。しかし、特定のダイナミック配列とその内容によっては、特別なオブジェクトプロパティの.$valueを使用する必要があるかもしれません。一部の関数は、オブジェクト全体に対して動作しません。例えば、lower()関数をオブジェクトの配列に使用することはできません。これを実行しようとすると、スクリプトはこの関数を無視します。このような場合は、回避策を講じる必要があります。例えば、配列内のオブジェクトから特定の値を別の変数にコピーすることが可能です。その後、lower()を変数の値として使い、必要であれば、変換された値をオブジェクトにコピーして戻すことができます。

以下の表の関数は、配列を処理するために特別に設計されています。これらの関数はArray ExamplesスクリプトにあるFunctions and Arraysスニペットでテストします。

関数

説明

count()

配列またはオブジェクト内の要素の数を返します。

index(indexValue)

指定されたindexValueに従って、変数の内容から配列要素を返します。

indexof(text)

変数内の指定されたtextの文字位置を返します。

size()

配列内の要素の数を返します。

split(delimiter)

変数の内容を、配列として扱うのに適したパイプ区切りのストリングとして返します。既存の指定されたdelimiterをパイプ文字に置き換えます。