多次元配列の意味がわかりません。プログラミング初心者です。

このQ&Aのポイント
  • $n, $i, $jという変数を使った多次元配列の処理について理解できていません。具体的には、$nがデータの件数を示しているのか、$iと$jがどのような処理をしているのかわかりません。
  • 具体的な処理について解説します。まず、$nはデータの件数を表しています。$iは行数を、$jは列数を表しています。この処理では、データが格納された多次元配列を逆順に読み込む処理を行っています。
  • 具体的なforループ処理としては、最初のforループでは$iが0から$n-1まで1ずつ増えていきます。2番目のforループでは、$jが$n-1から$iまで1ずつ減っていきます。このような処理を行うことで、多次元配列の要素を逆順に読み込むことができます。
回答を見る
  • ベストアンサー

多次元配列の意味がわかりません。

プログラミング初心者です。 以下の配列の記述があったのですが、どのような配列なのか理解できていません。 すみません。教えていただけますでしょうか。 $n = count($entry_count); for($i=0;$i<$n;$i++){ for($j=$n-1;$j>$i;$j--){ if分が続きます。 } } 私の理解が間違っていなければ、iは行数jは列数と理解しています。 $nが何を示しているのか推測でしか言えませんが、列数と考えれば良いでしょうか? それともデータの件数と考えれば良いでしょうか? 内容はjの初期値がn-1(件数よりマイナス1)として、iより大きい間、jを1つずつ減らしていき iは1つずつ足していく様です。 分からないのは以下の点です。 ・$nはデータの件数でしょうか?  もしそうであればiは始めのfor分はその件数分繰り返すと考えると分かります。  但し、jはどのように理解すれば良いか分かりません。 ・$jがもし列数と考えれば、なぜ初期値が$jの値がマイナス1なのか。  配列のインデックスが0から始まるからでしょうか? ・$jをなぜ1つずつ減らしていくのでしょうか?  列数を1つずつ減らしていくというのは、そのデータの列を前から読み込んでいくという処理の  意味の記述でしょうか? 要するにiとjが何かが理解できていません。 よろしくお願いいたします。

  • PHP
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • nak777r
  • ベストアンサー率36% (49/136)
回答No.3

とりあえず、$n の値が 5だった場合 $i=0,$j=4 で ifの条件処理 $i=0,$j=3 で ifの条件処理 $i=0,$j=2 で ifの条件処理 $i=0,$j=1 で ifの条件処理 $i=1,$j=4 で ifの条件処理 $i=1,$j=3 で ifの条件処理 $i=1,$j=2 で ifの条件処理 $i=2,$j=4 で ifの条件処理 $i=2,$j=3 で ifの条件処理 $i=3,$j=4 で ifの条件処理 という動きになります 絵にするとこんな感じ $i の動きが * $j の動きが @ [*][_][_][_][@] $i=0,$j=4 [*][_][_][@][_] $i=0,$j=3 [*][_][@][_][_] $i=0,$j=2 [*][@][_][_][_] $i=0,$j=1 [_][*][_][_][@] $i=1,$j=4 [_][*][_][@][_] $i=1,$j=3 [_][*][@][_][_] $i=1,$j=2 [_][_][*][_][@] $i=2,$j=4 [_][_][*][@][_] $i=2,$j=3 [_][_][_][*][@] $i=3,$j=4

その他の回答 (2)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

> ・$nはデータの件数でしょうか? count($entry_count) の結果です。 http://php.net/manual/ja/function.count.php $entry_countがなんなのかによって答えが違います > ・$jがもし列数と考えれば、なぜ初期値が$jの値がマイナス1なのか。 > ・$jをなぜ1つずつ減らしていくのでしょうか? $nに適当な値を入れて、そのループがどんな$i,$jの組合せになるか、考えてみてはどうです? $i=0の回 →$j=4;$j>0 →→(0,4)(0,3)(0,2)(0,1) $i=1の回 →$j=4;$j>1 →→(1,4)(1,3)(1,2) ..... $n-1でなく$nだったらどうなるか、$jが「前(=小さい方)から」になっているか、わかると思います。 おそらく、これは、1次元配列を利用した、重複チェックとか、並び換え(バブルソートか挿入ソートかそのあたり)とかのプログラムです。 $iと$jは、比較に使う組み合わせ($entry_count[$j]と$entry_count[$i])を示しているだけでしょう。 行と列を使うようなら$entry_count[$j][$i]などと使うはずですが、おそらく、そんな使い方はしてないのでは?

ymoshimoshi
質問者

お礼

分かりやすく教えていただきありがとうございまいsた。 明確になりました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

見る限り多次元配列の処理ではないかと <?PHP $entry_count=array("a","b","c","d"); $n = count($entry_count); for($i=0;$i<$n;$i++){ for($j=$n-1;$j>$i;$j--){ print $entry_count[$i]."-".$entry_count[$j]."<br>\n"; } } ?> ようは配列内の要素を重なりなく比較する処理かなと

ymoshimoshi
質問者

お礼

ありがとうございました。 >配列内の要素を重なりなく比較する処理 という記述からバブルソートという言葉が検索で引っかかりました。 内容を見るとそれではないかと分かりました。

関連するQ&A

  • 2次元配列

    課題で、氏名をローマ字で入力し、2次元配列に格納するプログラムを作成するというのがでました。条件として、氏名の長さは10文字以下、最大件数は10件。1エントリ入力ごとに累計件数を表示し、10件目の入力が完了するか、氏名の一文字目に'0'が入力されたら入力を終了しデータを表示する。11文字以上入力されたら、先頭から10文字までを有効とし、11文字目以降を無視する。 改行のみの入力の場合、エラーメッセージを表示し、再入力させる。 初心者の私には、データの表示と、条件の処理の仕方がわかりません。 下記プログラムを上記の条件を満たすようにするには、どこを直したらよいか教えてください。 お願いします。 #include <stdio.h> #include <string.h> #define BUFFERSIZE 1024 main() { char str[10][BUFFERSIZE]; char c; int count = 0; int i; int j; int l[10]; /*氏名の入力*/ for (i = 0; i < 10; i++) { printf("氏名人力 : "); while ( (c = getchar()) != '\n' ) { if( count < BUFFERSIZE - 1 ){ str[i][count++] = c; } } str[i][count] = '\0'; printf("累計 : %d \n", i+1); } for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { printf("%c",str[i][j]); } putchar('\n'); } return 0; }

  • 2次元配列

    大学の課題なのですが 10×10の2次元配列に、平面のビットパターンが入っているとする(0と1の整数が入っているとする)。左右反転して出力しなさい。 という問題で、自分は以下のプログラムを作ったのですが、うまくうごいてくれません。だれか間違いを指摘していただけないでしょうか。 よろしくお願いします。 #include<stdio.h> int main(void) { int i,j; int data[10][10]={0,1}; for(i=0;i<10;i++){ for(j=0;j<10;j++){ printf("%3d",data[10-i][10-j]); } printf("\n"); } return(0); }

  • 二次元配列について

    下記のプログラムにてNが100の時はコンパイル/実行 ともに出来ます。しかし、Nを1024にするとコンパイル は出来るのですが、実行すると"セグメンテーション 違反です"と言われてしまいます。 Cの文法的には正しいと思うのですが、何がいけない のでしょうか? 動作環境はPen4+Linux 2.4.20です。 よろしくお願いします。 ------ ↓以下プログラム #include <stdio.h> #define N 100 //1024 main(){ int i,j; double aa[N][N]; for(i=0;i<N;i++) for(j=0;j<N;j++) aa[i][j]=0; }

  • 3次元配列のループによる比較の回数を減らす

    以下は正の整数が入った3次元配列form[30][20][8]で、中身が一致している2カ所に-1を代入してループを抜けるというプログラムの一部分なんですが、無駄なループを減らすにはどういった変更をすればいいでしょうか? form[30][20][8]は変更しない方向でお願いします。 check: for(int i=0;i<30;i++){ for(int j=0;j<20;j++){ for(int k=0;k<8;k++){ for(int l=0;l<30;l++){ for(int m=0;m<20;m++){ for(int n=0;n<8;n++){ if(form[i][j][k]==form[l][m][n]&&!(i==l&&j==m&&k==n)form[i][j][k]!=-1) count++; form[i][j][k]=-1; form[l][m][n]=-1; break check; } } } } } } }

    • ベストアンサー
    • Java
  • 多次元配列から重複を削除

    Perlにて$f[i][j]のような2次元配列でデータを格納しています。 ここの[i]列には重複したデータが入っているので、 それを排除して[i]列の重複なしの配列を新たに作りたいのですが うまくいきません。 for ($j=0; $j<= $index; $j++){ if($chlist[j]==$f[$i][0]){ $chlist[j]==$f[$i][0]; last; } } こんな感じで作ってみたのですが永遠にデータが入りません。

  • エクセルVBAの配列について

    エクセルVBAの配列について VBAをはじめたばかりの初心者です。 現在、下記のようにデータを配列の中に入れ、 別シートに書き出そうとしております。 (配列へ読み込むところのみ) Dim 配列(1 To 件数, 1 To 9) As Variant For j =1 To 件数 For i = 2 To L If Cells(i, 2).Value = Tx_month Then For k = 3 To 11 配列(j, k - 2) = Cells(i, k).Value Next k End If Next j,i 現状では、データの最終行のみを「件数」分書き出してしまいます。 jとiのForが重なっているからだと思うのですが、どう書き直したら良いか分かりません。 質問をさせていただくのも初めてなので、分かりづらく恐縮ですが お力添え頂けますと幸いです。 どうぞ宜しくお願い致します。

  • Javascriptで二次元配列で高次元の配列サイズを取得する方法を教えてください。

    Javascriptで二次元配列で高次元の配列サイズを取得する方法を教えてください。 var data = [ [1,2,3], [4,5,6], [7,8,9] ]; for (var i = 0; i < data.length; i++){ for (var j = 0; j < data[i].length; j++){ <--- ここで lengthのオブジェクトがNullというエラーになります。 alert(data[i][j]); } } よろしくお願いいたします。

  • 二次元配列のソートについて

    PHPでデータベースの複数のテーブルから ID、名前、かな、点数といったデータを 読み込んでテーブルに保存しています。 SELECT id, name, kana, tensu FROM a, b, c ORDER BY tensu といった形で出来ると思っていたのですが エラーが出てできませんでした。 そこで各テーブルのデータを 読み込んで二次元配列にしてソート してみたのですが、なぜか以下のソースだと データが重複されて表示されて 困っています。 $saidai = count($tbl); for ($i=0 ;$i<$saidai;$i++){  $sort[$i] = $i; } for($i=0;$i<$saidai;$i++){  for($j=0;$j<$saidai;$j++){   if($tbl[$sort[$i]][2] > $tbl[$sort[$j]][2]){    $work = $sort[$i];    $sort[$i] = $sort[$j];    $sort[$j] = $work;   }  }  表示 } こんな感じですがどうも繰り返しても 同じデータばかりが表示されます。 いろいろ試してみましたが結局出来ませんでした。 表示するデータがかぶらないようにするには どうすればよろしいですか? お願いいたします。

    • ベストアンサー
    • PHP
  • 2次元配列を使ったC言語の九九表を作りたいんですが、方法がわかりません。

    C言語で、九九の表を作っているのですが2次配列を使わないでの方法なら出来るんですが、 2次配列を使うと出来なくなってします。 下記のように途中まで組んだのですが、どうしてもエラーがでてしまいます。 #include <stdio.h> int main(void) { int i,j,a[9][9]; printf(" "); for(i=1; i<=9; i++) printf("%3d", i); printf("\n"); for(i=0; i<9; i++){ for(j=0; j<9; j++) a[i][j]= {1,2,3,4,5,6,7,8,9},{2,4,6,8,10,12,14,16,18},{3,6,9,12,15,18,21,24,27},{4,8,12,16,20,24,28,32,36},{5,10,15,20,25,30,35,40,45,6,12,18,24,30,36,42,48,54,7,14,21,28,35,42,49,56,63},{8,16,24,32,40,48,56,64,72},{9,18,27,36,45,54,63,72,81} }; for(i=0; i<9; i++){ printf("%3d", i+1); for(j=0; j<9; j++) printf("%3d",a[9][9]); printf("\n"); } return 0; } とやったのですが…以下に書く部分が間違っているようで。 #include <stdio.h> int main(void) { int i,j,a[9][9]; printf(" "); for(i=1; i<=9; i++) printf("%3d", i); printf("\n"); for(i=0; i<9; i++){ for(j=0; j<9; j++) a[i][j]=□ } for(i=0; i<9; i++){ printf("%3d", i+1); for(j=0; j<9; j++) printf("%3d", □); printf("\n"); } return 0; } 色々調べたり、少しずつ変えながら試しているのですが、できません。 どなたかわかるかたいらっしゃいますか。間違いがわかりません… 配列を使用しなくても出来ることは、わかるのですが、配列を使うバージョンでもできるようになりたいんです。 私がしようとおもっているのは、81個分の値を先に計算し、9×9の2次元配列に格納し、次に81個の配列要素の値を出力したいのですが、 間違いと方法がわかる方いらっしゃいませんか。

  • 二次元配列に関する質問です。

    一次元配列はわかるのですが二次元配列になると、わからない時があります。 <ソース> #include<stdio.h> int main() { int dat[2][5]={1,2,3,4,5,6,7,8,9,10}; int i; int j; for(i=0;i<2;i++){ for(j=0;j<5;j++){ printf("dat[%d][%d] %d\n",i,j,dat[i][j]); } } return 0; } このプログラムでわからないのは、 int dat[2][5]={1,2,3,4,5,6,7,8,9,10};の部分です。 普段は、int dat[2][5]={{1,2,3,4,5}, {6,7,8,9,10}, }; という使い方をしているのですが・・・。 どうちがうのでしょうか?

専門家に質問してみよう