スクリプト/文字列引数による多次元配列生成関数(履歴ID:567)

最終投稿者:    mini とりか 更新:2014/03/09 17:31:58
引数に指定した文字列を用いて、多次元配列の生成を行う関数です。
2次元配列や3次元配列といった、複雑な配列構造生成をサポートします。

RPG・ノベル両方に対応

まずこれを開始スクリプトにコピペしてください。
####変数型最適化関数
def myDataFix (myV)
 #操作用の値を取得
 tV = myV
 #値を取得
 Get = myV
 #値の数値変換結果を取得:文字ならNaNが入る  
 STR = toNumber(myV)

 #STRとGetが等しいなら数値と判断
 if (STR == Get)
  #toNumber()で数値型データにした値を代入
  tV = STR
 end
 #値がtrueなら
 if (Get == "true")
  #論理型のtrueを代入
  tV = true
 end
 #値がfalseなら
 if (Get == "false")
  #論理型のfalseを代入
  tV = false
 end

 #値を代入した変数を返す
 resV = tV 
 return resV
end

####配列の最初の要素を削除する関数
def myShiftArray (Arr)
 resS = Arr[0]
 ic = 1
 while (ic < getArrayLength(Arr))
  Arr[ic - 1] = Arr[ic]
  ic = ic + 1
 end
 popArray(Arr)
 return resS
end

####配列終了判定:深度計測版
def myDepthArr(RArray, GetSS, Wpt, Dep)
 Get = joinArray(GetSS, "")
 RArray[Wpt] = myDataFix(Get)
 GetSSP = popArray(GetSS)
 if (GetSSP == "}")
  Dep = myDepthArr(RArray, GetSS, Wpt, Dep + 1)
 end
 return Dep
end

####分解文字列代入処理
def myDisArr (TArray, RArray, Rpt,Mode)
 #返り値用配列:Rpt=読み込みポインタ:Wpt=書き込みポインタ
 TLength = getArrayLength(TArray)
 resFlag = 0
 Dep = 0

 #データ個数分ループ 
 Wpt = 0
 while (Rpt < TLength && resFlag == 0) 
  if (Dep > 0)
   return Dep - 1
  end
  
  ArrFlag = 0
  Get = TArray[Rpt]

  #配列開始の判定
  GetSS = splitString(Get, "")
  if (GetSS[0] == "{")
   #配列の最初の要素を削除したものを書込み
   myShiftArray(GetSS)
   TArray[Rpt] = joinArray(GetSS, "")
   
   #再帰呼び出し
   RArray2nd = createArray()
   Dep = myDisArr (TArray, RArray2nd, Rpt)
   RArray[Wpt] = RArray2nd
   Rpt = Rpt + getArrayLength(splitString(joinArray(RArray2nd, ","), ",")) - 1
   ArrFlag = 1
  end

  #配列終了の判定
  GetSSP = popArray(GetSS)
  if (GetSSP == "}" && ArrFlag == 0)
   Dep = myDepthArr(RArray, GetSS, Wpt, 0)
   return Dep
  end

  if (ArrFlag == 0)
   if (Mode == 1)
    RArray[Wpt] = myDataFix(Get)
   else
    RArray[Wpt] = Get    
   end
  end
  
  #RWポインタカウントアップ
  Wpt = Wpt + 1
  Rpt = Rpt + 1
 end

 return 0
end

####構造体生成関数
def myDataIni (myMoji,Mode)
 #入力文字列を各値ごとに分解
 TArray = splitString(myMoji, ",")
 RArray = createArray()

 #各値を代入した配列を返す
 myDisArr(TArray,RArray,0,Mode) 
 return RArray
end


使いたい場所に以下の形式で関数を呼び出します。
配列化されたデータは返り値に指定されているので必ず関数実行結果の代入先を用意してください。
今回の例の場合、Stに配列が格納されます。


  • 配列に格納する値が文字列のみの場合・・・第2引数に0を指定
St = myDataIni("A,{B,C}",0)

  • 配列に格納する値に数値や真偽値を混ぜる場合・・・第2引数に1を指定
St = myDataIni("A,{B,C}",1)

配列に格納する値に数値や真偽値を混ぜる場合において、半角数字の文字列は数値型データに、trueとfalseの文字列は真偽値型のデータに変換されます。

配列化の文字列形式ルール
  • ","で値を区切ることができる
 →例:"A,B" → 配列[0] = A : 配列[1] = B
  • "{}"で囲むことで値を配列として配列の中に生成できる
 →例:"A,{B,C}" → 配列[0] = A : 配列[1] = B,C : 配列[1][0] = B : 配列[1][1] = C
  • "{,B}"や"{A,}"の場合、空文字が配列に代入されることになる
 →配列[0] = 空文字 : 配列[1] = B
 →配列[0] = A : 配列[1] = 空文字
  • "{"に対して"}"が多い場合、途中で配列生成が終了する。
 →期待する配列が生成されないので注意

配列の生成できる深さの限界は特になし
St = myDataIni("A,{{B,C,D},E,{F,G,H}},10000,J,{{K,{L,M},N},O},false,Q,{{{R}}},true",1)

4次元程度までは検証済み、こんな感じに奇妙な配列構造でも配列にしてStに生成結果を返す