連想配列

連想配列とは、自動的に割り当てられる数字をキーとして持つかわりに、自由に任意の文字列を割り振ることができる配列のことです。添え字に番号の代わりに名前をつけることでわかりやすく管理することができます。

構文
// 連想配列の宣言
HASHTBL 変数

// 大文字小文字を区別する(デフォルトは区別しない)
HASHTBL 変数 = HASH_CASECARE

// 順列で読出す時にキーはソートされている
HASHTBL 変数 = HASH_SORT

// キーにデータを代入
変数[キー] = データ

// キーが存在するか
変数[キー, HASH_EXISTS]

// キーを削除
変数[キー, HASH_REMOVE]

// 指定した順列番号のキーを取得
変数[順列番号, HASH_KEY]

// 指定した順列番号のデータを取得
変数[順列番号, HASH_VAL]

// 連想配列を削除
変数 = HASH_REMOVEALL

削除 HASH_REMOVE は必要無くとも変数で受ける必要あり
引数
戻り値

連想配列とは

配列の添え字に好きな名前をつけられる配列のことです。

配列との違い

配列は添え字(インデックス)が0から始まる連番になります。一方、連想配列は添え字に数字だけではなく文字列(キー)を付けることもできます。

シンプルなデータの場合は配列でも特に問題はないですが、配列の中にいろいろなデータを格納するとき、添え字が連番だとどこになんのデータが入っているのかがわかりづらくなってしまいます。

そこで配列のキーを番号で管理するのではなく名前を付けることによって、どこに何のデータが格納されているのかわかりやすくなります。

以下のように配列で書いた場合、配列名がuserだから個人に関することが格納されてるんだろうとか、「田中」が名前っていうのはわかるけど、「21」って何の値だっけ?とか「0105」って何の番号だ?とかなってくると思います。

UWSC
DIM user[] = "田中", 21, "0105"

そこで連想配列でインデックスに名前をつけておくと、「21」はageだから年齢で、「0105」がbirthdayだから誕生日かっていうのがひと目でわかるようになります。

UWSC
HASHTBL user

user["name"] = "田中"
user["age"] = 21
user["birthday"] = "0105"

要素の追加

要素を追加するには以下のように記述します。要素を追加すると順列番号は0から順に1ずつ加算されていきます。

UWSC
連想配列名[キー名]

以下は要素を追加するプログラムです。

UWSC
HASHTBL user

user["name"] = "田中"

PRINT user["name"]
結果
プレーンテキスト
田中

すでに存在する要素に値を追加した場合、データが上書きされます。

UWSC
HASHTBL user

user["name"] = "田中"
user["name"] = "大西"

PRINT user["name"]
結果
プレーンテキスト
大西

要素の存在有無の確認

要素が存在するか確認するには以下のように記述します。存在する場合はTrue、存在しない場合にはFalseが返ります。

UWSC
連想配列名[キー名, HASH_EXISTS]

以下は要素が存在するか確認するプログラムです。user[age]は存在するのでTrue、user[id]は存在しないのでFalseが返ります。

UWSC
HASHTBL user

user["name"] = "田中"
user["age"] = 21
user["birthday"] = "0105"

PRINT user["age", HASH_EXISTS]
PRINT user["id", HASH_EXISTS]
結果
プレーンテキスト
True
False

キーを削除

連想配列のキーを削除するには以下のように記述します。キーを削除できた場合True、削除できなかった(存在しなかったなどの)場合はFalseが返ります。キーを削除すると削除したキー以降の順列番号が詰められ連番は維持されます。

UWSC
連想配列名[キー, HASH_REMOVE]

以下はキーを削除するプログラムです。1回目の削除はnameキーが存在するのでTrueが返りますが、2回目はすでに削除されていてnameキーが存在しないのでFalseが返ります。

UWSC
HASHTBL user

user["name"] = "田中"

PRINT user["name", HASH_REMOVE]
PRINT user["name", HASH_REMOVE]
結果
プレーンテキスト
True
False

HASH_REMOVEは必要無くとも変数で受ける必要があるので、以下のように記述するとエラーが発生します。

UWSC
HASHTBL user

user["name"] = "田中"

user["name", HASH_REMOVE]

そのため結果を変数に代入するか画面やログに出力する必要があります。

UWSC
HASHTBL user

user["name"] = "田中"

DIM tmp = user["name", HASH_REMOVE]

わざわざ変数を使いたくないというときはFUKIDASI関数 (スクリプト関数)で画面に出力してください。

UWSC
HASHTBL user

user["name"] = "田中"

FUKIDASI(user["name", HASH_REMOVE])

順列番号からキー名を取得

順列番号からキー名を取得するには以下のように記述します。

UWSC
連想配列名[順列番号, HASH_KEY]

UWSC
HASHTBL user

user["name"] = "田中"
user["age"] = 21
user["birthday"] = "0105"

PRINT user[2, HASH_KEY]
結果
プレーンテキスト
birthday

順列番号は 0 以上 要素数-1 以下の範囲を取ります。そのためFOR文でループすることも可能です。ループする際、順列番号に変数を指定します。

UWSC
HASHTBL user

user["name"] = "田中"
user["age"] = 21
user["birthday"] = "0105"

FOR i = 0 TO LENGTH(user)-1
	PRINT user[i, HASH_KEY]
NEXT
結果
プレーンテキスト
name
age
birthday

順列番号からデータを取得

順列番号からデータを取得するには以下のように記述します。

UWSC
連想配列名[順列番号, HASH_VAL]

UWSC
HASHTBL user

user["name"] = "田中"
user["age"] = 21
user["birthday"] = "0105"

PRINT user[2, HASH_VAL]
結果
プレーンテキスト
0105

連想配列をキー名でソートする

連想配列をキー名で昇順ソートするには連想配列宣言時に「HASH_SORT」を指定します。

UWSC
HASHTBL fruits = HASH_SORT OR HASH_CASECARE

fruits["apple"] = "りんご"
fruits["grape"] = "ぶどう"
fruits["cherry"] = "さくらんぼ"
fruits["peach"] = "もも"
fruits["banana"] = "バナナ"

PRINT fruits["Apple"]
PRINT fruits["grape"]
PRINT "----------"

FOR i=0 TO LENGTH(fruits)-1
	PRINT fruits[i, HASH_KEY]  + ":" + fruits[i, HASH_VAL]
NEXT
結果
CSV
apple:    りんご
banana:   バナナ
cherry:   さくらんぼ
grape:    ぶどう
peach:    もも

以下はFOR-IN-NEXTで書いた場合。

UWSC
HASHTBL fruits = HASH_SORT

fruits["apple"] = "りんご"
fruits["grape"] = "ぶどう"
fruits["cherry"] = "さくらんぼ"
fruits["peach"] = "もも"
fruits["banana"] = "バナナ"

FOR item IN fruits
	PRINT item + ":" + fruits[item]
NEXT
結果
CSV
apple:    りんご
banana:   バナナ
cherry:   さくらんぼ
grape:    ぶどう
peach:    もも

降順ソートは指定できないので、昇順ソートした配列をFOR文で後ろから要素を取得していきます。

UWSC
HASHTBL fruits = HASH_SORT OR HASH_CASECARE

fruits["apple"] = "りんご"
fruits["grape"] = "ぶどう"
fruits["cherry"] = "さくらんぼ"
fruits["peach"] = "もも"
fruits["banana"] = "バナナ"

FOR i=LENGTH(fruits)-1 TO 0 STEP -1
	PRINT fruits[i, HASH_KEY]  + ":" + fruits[i, HASH_VAL]
NEXT
結果
CSV
peach:    もも
grape:    ぶどう
cherry:   さくらんぼ
banana:   バナナ
apple:    りんご

連想配列のキーの大文字小文字の区別をする

キーの大文字と小文字を区別するには宣言時に「HASH_CASECARE」を指定します。指定したキーの大文字と小文字を区別するので、「PRINT fruits["Apple"]」ではりんごは出力されません。

UWSC
HASHTBL fruits = HASH_CASECARE

fruits["apple"] = "りんご"
fruits["grape"] = "ぶどう"
fruits["cherry"] = "さくらんぼ"
fruits["peach"] = "もも"
fruits["banana"] = "バナナ"

PRINT fruits["Apple"]
PRINT fruits["grape"]
結果
プレーンテキスト

ぶどう

連想配列のキーでソートし、かつ、大文字小文字を区別する

キーの大文字と小文字を区別し、さらにソートするには宣言時に「HASH_SORT OR HASH_CASECARE」を指定します。

UWSC
HASHTBL fruits = HASH_SORT OR HASH_CASECARE

fruits["apple"] = "りんご"
fruits["grape"] = "ぶどう"
fruits["cherry"] = "さくらんぼ"
fruits["peach"] = "もも"
fruits["banana"] = "バナナ"

PRINT fruits["Apple"]
PRINT fruits["grape"]
PRINT "----------"

FOR item IN fruits
	PRINT item + ":" + fruits[item]
NEXT
結果
CSV

ぶどう
----------
apple:        りんご
banana:       バナナ
cherry:       さくらんぼ
grape:        ぶどう
peach:        もも

連想配列のキー名と値を入れ替える

連想配列 (自作関数)を使い連想配列のキー名と値を入れ替えます。

UWSC
HASHTBL fruits

fruits["apple"] = "りんご"
fruits["grape"] = "ぶどう"
fruits["cherry"] = "さくらんぼ"
fruits["peach"] = "もも"
fruits["banana"] = "バナナ"

arrayFlip(fruits)

FOR n = 0 TO LENGTH(fruits) - 1
	PRINT fruits[n, HASH_KEY] + ":" + fruits[n, HASH_VAL]
NEXT

//////////////////////////////////////////////////
// 【引数】
//   associative : キーと値を入れ替える連想配列。参照引数。 
// 【戻り値】
//   
//////////////////////////////////////////////////
PROCEDURE arrayFlip(Var associative[])
    HASHTBL tmp
    FOR i = 0 TO LENGTH(associative)-1
        tmp[associative[i, HASH_VAL]] = associative[i, HASH_KEY]
    NEXT
    associative = HASH_REMOVEALL
    FOR i = 0 TO LENGTH(tmp)-1
        associative[tmp[i, HASH_KEY]] = tmp[i, HASH_VAL]
    NEXT
FEND
結果
CSV
りんご:       apple
ぶどう:       grape
さくらんぼ:   cherry
もも:         peach
バナナ:       banana

この記事は役に立ちましたか?

はい
いいえ
ご協力ありがとうございます。

関連記事

CALCARRAY関数 (スクリプト関数)
配列データを計算します。
GETALLWIN関数 (スクリプト関数)
全ウィンドウのIDを取得します。
GETOLEITEM関数 (スクリプト関数)
コレクションを取得します。
JOIN関数 (スクリプト関数)
配列の中身を区切り文字で結合し、文字列として返します。
LENGTH関数 (スクリプト関数)
文字数もしくは配列サイズを返します。
SETCLEAR関数 (スクリプト関数)
配列を指定された値で埋めます。
SHIFTARRAY関数 (スクリプト関数)
配列データをシフトします。
divisors (自作関数)
引数に指定した数値の約数のリストを返します。
Collatz (自作関数)
コラッツ数列 を求め結果を配列で返します。
arraySearch (自作関数)
配列の中から指定した要素が見つかった場合、その要素がある最初のインデックスを返します。