三次元配列の要素をMCで指定して呼び出す方法

このQ&Aのポイント
  • 三次元配列の要素をMCで指定して呼び出す方法について解説します。
  • 指定されたムービクリップをクリックすると、三次元配列から対応する要素を取得して出力します。
  • 現在の実装では、どのムービクリップをクリックしても「undefined」が返ってくる問題が発生しています。書き直し方を教えてください。
回答を見る
  • ベストアンサー

三次元配列の要素をMCで指定して呼び出す

a0b0~a2b2の計九つのムービクリップをクリックすると、三次元配列の要素からデータを取り出して出力することを考えています。たとえばa1b2をクリックすると、配列の中から[1][2]の要素を取りだします。下の配列の場合は"ウ"を出力します。 // var obj_array:Array = [["1", "2", "3"], ["a", "b", "c",], ["ア", "イ", "ウ"]]; for (var i = 0; i<=2; i++) { this[i].n = i; for (var j = 0; j<=2; j++) { // 各ボタンの固有値 n を設定 this[j].m = j; // 各ボタンの onRelease 動作定義 this["a"+i+"b"+j].onRelease = function() { trace(obj_array2[this.n][this.m]); }; } } //  しかし、どれをクリックしても"undefined"で返ってきます。  どのような書き直せばよいかご教授ください。

  • Flash
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

ボタンとして使うムービークリップごとに参照するインデックス(配列変数に含まれる変数の管理番号)が異なるので、この番号はムービークリップ1つ1つに変数を作成して記録しておく必要があります。 これは、onRelease = function でイベント処理を定義するのと同じ要領で  インスタンスの参照.変数名 = 値; というように定義します。 for ループの中で this[ i ].n = i; とすると、この this は各ムービークリップでも配列変数 obj_array でもなく、スクリプトが書かれているタイムラインを指します。 そのため、各ムービークリップに変数 n は定義されませんから、この変数を使って配列変数から値を取得しようとしても失敗してしまいます。 変数 m についても同様です。 それから、trace アクションで表示させる時の配列変数の名前が” obj_array2 ”になっているようです。 実際に使っている配列変数は” obj_array ”ですので、undefined (未定義)と表示されてしまいます。 ****************************** 以上の点を修正しますと、スクリプトは大体、次のようになります。 このスクリプトは、ムービークリップ a0b0 ~ a2b2 が存在するタイムラインのフレームに設定してください。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください)  var obj_array:Array =  [   [ "1" , "2" , "3" ] ,   [ "a" , "b" , "c" ] ,   [ "ア" , "イ" , "ウ" ]  ];  //全ボタンのセットアップ  //a0b0~a2b2まで総当たりで定義  for( i = 0; i <= 2; i++ )  {   for ( j = 0; j <= 2; j++ )   {    //セットアップするムービークリップの参照を保持    clip = this[ "a" + i + "b" + j ];    //参照するインデックスを記録しておく    clip.n = i;    clip.m = j;    //ムービークリップをボタン化する    clip.onRelease = function()    {     //配列変数を見て、値を取得     trace( obj_array[ this.n ][ this.m ] );    };   }  } onRelease に登録する関数の中での this は、onRelease の持ち主を指します。 この関数の外で使う this とは指す対象が違いますので、ご注意ください。

kolbejp
質問者

お礼

有難うございました。無事動きました。感謝です。またよろしくお願い申し上げます。

kolbejp
質問者

補足

ありがとうございます。これは三次元でなく二次元配列でしたね。とりあえず、このサンプル例を参考に今から、こちらで製作中のものを作り替えてみます。とりあえずお礼を。また、成功したら改めてお礼申し上げます。しかしclip = this[ "a" + i + "b" + j ]は驚きました。

関連するQ&A

  • 3次元配列を1次元配列に

    例えば2次元配列だと, array[row*i+j] = a[n]; といったように1次元に直すことができますよね? 同様に3次元配列を1次元配列にしたい場合には arrayの中はどのような式をつかえばいいのでしょうか。 よろしくお願いします。

  • this.nの記述について

    ムービクリップのa1,a2,a3,a4をロールオーバするとそれぞれ対応する数字のh1,h2,h3,h4のムービクリップのalphaが0から100にtweenを使って動かすことを考えたいと思います。 //初期設定 var obj_array:Array = new Array(); for (var i = 1; i<=4; i++) { obj_array[i] = eval("a"+i); obj_array[i]._alpha = 0; } //ここからロールオーバの操作 import mx.transitions.*; import mx.transitions.easing.*; for (var i = 1; i<=4; i++) { // 各ボタンの固有値 n を設定 this["h"+i].n = i; // 各ボタンの onRollOver 動作定義 this["h"+i].onRollOver = function() { var tween_handler:Object = new Tween("a"+this.n, "_alpha", Strong.easeOut, 0, 100, 1, true); };  しかし、まったく動作しません。理由としては何が考えられるでしょうか。

    • ベストアンサー
    • Flash
  • 配列について、その要素を並べ替えて得られる配列を重複することなく全て得たいです。

    要素数が5つなら5!で120通り、nであればn!通りの配列をすべて得たい、といった具合です。 自分で組んでみたところ、再帰呼び出しを多用しているせいか要素を8つにした時点でFirefoxだと「このページのスクリプトは処理に時間がかかっているか応答しなくなっています。…」、IEでも似たような警告文が表示されてしまいます。 コードは以下に示すとおりです。 そこでお聞きしたいのは、  1.「処理に時間が~云々」などの表示をさせずに処理を   続けさせるにはどのように書いたらいいか  2.もっと短くスマートなコードで全走査できないか の2つです。 1.についてはユーザサイドでなく開発者サイドで、かつalertを使う以外の方法で、警告文を出させないで処理を続けさせるためにはコードをどのようにしたらよいでしょうか。 2.に関しては、私が書いたコードは正直わかりにくいと思いますので、もっとシンプルに全走査できるアルゴリズムがあったら教えてほしいです。 どうかよろしくお願いします。 <html> <body> <script type="text/javascript"> <!-- //Arrayオブジェクトに自身をコピーした配列を返すclone()メソッド追加 Array.prototype.clone = function(){ // 自分自身が配列かをチェック if(this[0].constructor == Array ){ var ar, n; //新しい配列を用意する ar = new Array(this.length); for(var n=0;n<ar.length;n++){ //再起呼び出しで配列の中身をコピー ar[n] = this[n].clone(); } //作成した配列を返す return ar; } return Array.apply(null,this); } //★要素を並べ替える前の配列の宣言 var ar = new Array("1","2","3","4","5","6","7","8"); //並べ替え後の配列を格納する配列宣言 var arranged_ar = new Array(); function arArrange(){ //引数は(呼び出した節の、並び替える前の配列内での順番,すでに取り出した節の配列,兄弟の配列) function createBranch(parentCounter,parentNodes,sameDepthBranches){ var branches = new Array(); //呼び出した節の子ノード格納用の配列宣言 branches = sameDepthBranches.clone(); //呼び出した節の兄弟をコピー branches.splice(parentCounter,1) //呼び出した節を除いて子ノードの配列作成完了 var pushed_ar = new Array(); //この節以前に登場した節を格納する(最終的に並べ替え終わった配列になる)配列宣言 pushed_ar = parentNodes.clone(); //呼び出し元のpushed_arをコピー for(var i=0;i<branches.length;i++){ pushed_ar.push(branches[i]); //pushed_arに子ノードを1つ追加 //走査が葉ノードに達したときの処理 if(pushed_ar.length == ar.length){ var length = arranged_ar.length; arranged_ar[length] = new Array(); for(var j=0;j<pushed_ar.length;j++){ arranged_ar[length].push(pushed_ar[j]); //arranged_arに並び替え後の配列を格納 } //走査がまだ葉ノードに達していない場合の処理 }else{ createBranch(i,pushed_ar,branches); //自身を再帰呼び出しすることで葉ノードに達するまでループ } //子ノード以下の走査が終わった場合の処理 pushed_ar.splice(pushed_ar.length-1,1); //追加した子ノードを削除して次の子ノード追加へ } return; } //↑で宣言したcreateBranch関数の呼び出し for(i=0;i<ar.length;i++){ var tempAr = new Array(); tempAr.push(ar[i]); createBranch(i,tempAr,ar); } //結果をresultに格納 var result = ""; for(var i=0;i<arranged_ar.length;i++){ result += i+1 + ": "; for(var j=0;j<arranged_ar[i].length;j++){ result += arranged_ar[i][j] + ","; } result += "<br>"; } //結果を画面に表示 document.getElementById("result").innerHTML = result; return; } --> </script> <input type="button" value="全並べ替えパターン走査" onclick="arArrange();"> <p id="result">ここに結果表示</p> </body> </html>

  • javascriptの2次元配列をソートの仕方

    function word_grouping(data) { var code = data; //先頭についている”code="を除去 code = code.replace("code=",""); var = code.split(","); var alpha =new Array(); alpha = ['A','B','C','D','E','F','G','H','I','J','K','L','M']; //2次元配列作成 var array = new Array(); for (i =0; i < alpha.length; i++) { array[i] = [' ','0']: } //グループ名を格納 for( i = 0; i <alpha.length; i++){ array[i][0] = alpha[i] //0番目の項目から順番にグループごとに分ける for( i = 0; i < sp.length; i++){ group = sp[i].substring(0.1); //どのグループに所属しているか調べる for( j = 0; j < alpha.length; j++){ //一致したグループの配列にカウント+1していく if(group == array[j][0]{ array[j][1]++; } } } メモ ・spにはグループのどこかに所属する20個のキーワードが入っていてそれをグループに振り分けている ・グループ分けには”A001”のAだけみて振り分けています したいこと ・arrayに入ったキーワードの数を降順で並び替えたい 分からない所 ・2次元配列をsortする仕方 こんな感じなんです わかる方回答お願いします。

  • 配列から別の配列の要素を削除する方法

    ある配列array_aに、100件の文字列要素が格納されています。 別の配列array_bには、80件の文字列要素が格納されています。 array_aの要素、array_bの要素共に重複するものはありません。 array_b中に存在する要素はすべてarray_a中にも存在します。 array_aにあり、array_bにはない要素で構成されたarray_cの作り方を教えてください。 例えば $array_a=array("a","b","c","d","e","f","g"); $array_b=array("e","b","d"); なら、 $array_c=array("a","c","f","g") になります。 配列array_aとarray_bは、 $array_b=array("b","b","d"); であったり、 $array_a=array("a","a","b","c","d","e","f","g"); といった「重複する要素を含むパターン」はありません。要素はすべてユニークです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 2次元配列のコピーについて

    2次元配列のコピーについて質問があります。 $Aが元の2次元配列、$Bがコピー先だとして、 ${$A}[0..N][0..N]に値が入っているとします。 ここで、$Bの代入を、$B=$Aとやってしまうと、$Aと$Bが連動してしまいます。 ($Bが書き換わったのに$Aも書き換わる) これはなぜなのでしょうか。 また、$Bの代入を、配列を走査して foreach (0.. $#{$A}) {  my ($i) = $_;  foreach (0.. $#{${$A}[$i]})  {   my ($j) = $_;   ${$B}[$i][$j] = ${$A}[$i][$j];  } } とすれば問題ないのですが、あまりスマートだと思えません。 もっとスマートにコピーする方法はありますか?

    • ベストアンサー
    • Perl
  • 多次元配列のソートがうまくいかない

    多次元配列のソートがうまくいかない 質問失礼します. 以下のような,String型,int型,double型の混在した多次元配列([3][3]の配列)をソートするプログラムを作成しました. このプログラムでは3番目の項目でソートを行っています. 問題点なのですが, 3番目の項目がdouble型の一桁(例えばarray[1][2]が2.0)ならばうまくソートできるのですが, 一つを2桁(例えばarray[1][2]を10.0)にすると何故か先頭の数(10.0の場合1)を基準にソートされてしまっているようです・・・ 配列へのデータの入れ方が間違っているのでしょうか? 原因がはっきりわからず困っているのですが, わかる方いましたらよろしくお願いします. public class Sort_test { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String[][] array = new String[3][3]; array[ 0 ][ 0 ] = "A"; array[ 0 ][ 1 ] = 2001+""; array[ 0 ][ 2 ] = 9.0+""; array[ 1 ][ 0 ] = "B"; array[ 1 ][ 1 ] = 1001+""; array[ 1 ][ 2 ] = 2.0+""; array[ 2 ][ 0 ] = "C"; array[ 2 ][ 1 ] = 3001+""; array[ 2 ][ 2 ] = 6.0+""; TheComparator comparator = new TheComparator(); // 3番目の項目でソートするように設定 comparator.setIndex( 2 ); // ソート実施 Arrays.sort( array, comparator ); dump(array); } public static void dump( String[][] array ) { for ( int i = 0;i < array.length;i++ ) { for ( int j = 0; j < array[ i ].length;j++ ) { System.out.print( "\t" + array[ i ][ j ] ); } System.out.println(); } } } //多次元配列ソート用クラス class TheComparator implements Comparator { /** ソート対象のカラムの位置 */ private int index = 0; /** ソートするためのカラム位置をセット */ public void setIndex( int index ) { this.index = index; } public int compare( Object a, Object b ) { String[] strA = ( String[] ) a; String[] strB = ( String[] ) b; return ( strA[ index ].compareTo( strB[ index ] ) ); } }

    • ベストアンサー
    • Java
  • 配列の次元を超えてランダムに選択したい

    PHP5.2.4を使用しています。 例えば、次のような2次元以上の配列があったときに $arr[0][0] = array('a' => 1, 'b' => 11); $arr[0][1] = array('a' => 2, 'b' => 5); $arr[0][2] = array('a' => 3, 'b' => 20); $arr[1][0] = array('a' => 4, 'b' => 3); $arr[1][1] = array('a' => 5, 'b' => 30); この5つから、'b'の値が10以上の候補だけのインデックス($arr【[1][1]】←この部分)を ランダムに1つ選ぶ方法はどのようになるのでしょうか? 自分が考えたのは for ($i = 0; $i < count($arr); $i++) {  for ($j = 0; $j < count($arr[$i]); $j++)  {   if ($arr[$i][$j]['b'] < 10)    continue;   $new_arr[] = array('index2' => $i, 'index1' => $j);  } } $key = array_rand($new_arr, 1); print_r($new_arr[$key]); //Array ( [index2] => 0 [index1] => 0 ) //Array ( [index2] => 0 [index1] => 2 ) //Array ( [index2] => 1 [index1] => 1 ) //いずれかが選択される なんですが、これだとあまり良いやり方だと思わなくて なにか別のやり方はあるのでしょうか?

    • 締切済み
    • PHP
  • 配列操作について

    お世話になります。 $obj = array(1 array(id=>111 name=>aaa date=yyyymmdd array(2 array(id=>222 name=>bbb date=yyyymmdd 上記のようなオブジェクト($obj)があるとして この最下層の連想配列データ(id,name,date)を 配列にしたい時は、以下のような書き方で取れると 思いますが、もっとすっきりさせる書き方などありますか? $a = array(); $c = count($obj); for($i=0; $i<$c; $i++){ $a = $obj[$i]['id']; $a = $obj[$i]['name']; $a = $obj[$i]['date']; $i++}

    • ベストアンサー
    • PHP
  • 二次元配列に数字をランダムに入れる

    --------------------------- | 2 | 3 | 7 | 4 | 1 || 17 |<横合計> --------------------------- | 6 | 1 | 2 | 3 | / || // | --------------------------- | 1 | / | / | / | / || // | --------------------------- | 2 | / | / | / | / || // | --------------------------- | 3 | / | / | / | / || // | --------------------------- --------------------------- | 14 | / | / | / | / || // |<全合計> --------------------------- <縦合計> このように表示される。 …という処理がしたいのですがどういう処理を書けば良いのかわかりません。 理解した(1)と(2)の乱数発生の文を書いておきます。 *二次元配列を作成* a = new Array(5) for (i = 0; i <= a.length-1; i++){ //1次元 a[i] = new Array(5) for (j = 0; j <= a[i].length-1; j++){ //2次元 a[i][j] = "["+ i +","+ j +"]" var g = ""; document.write(a[i][j]); } } *乱数を100回発生* var z = ""; for(k = 1; k <= 100; k++){ z = Math.round(Math.random()); //発生した乱数をzに代入 } 以上、 よろしくお願いいたします。

専門家に質問してみよう