2次元配列の文字の検索について

このQ&Aのポイント
  • Boggleゲームのプログラムを考えている際に、2次元配列の文字の検索方法について質問です。
  • 文字列がルールに従って検索可能かどうかを判定するプログラムを作りたいが、どうすればよいかわからない。
  • 異なる文字同士が隣り合っているかどうかを判定する必要があり、検索範囲や同じインデックスの文字の使用制限も考慮に入れる必要がある。具体的な実装方法についてアドバイスをいただきたい。
回答を見る
  • ベストアンサー

2次元配列の文字の検索について

お世話になります。今Boggleゲームというもののプログラムを考えているのですが、配列の検索についてお聞きしたいことがあります。 Boggleゲームは、4×4の正方形のマス1つ1つにアルファベットが書いてあるサイコロが入っており、 縦横斜めから英単語がいくつ出来るかを探して競うゲームです。今回は英単語に限らず、指定した文字列がこのルールで見つけられるかを試します。 もしその文字列がこのルールで見つかればtrue、見つからなければfalseを返します。 例えば、 A B C D E F G H I J K L M N O P という2次元配列があり、この中からABGLPを探すとすると、AとBは隣り合っており、BとGは斜めで隣り合っており、GとLも斜めで隣、 LとPは上下で隣なので、ABGLPはOKです。 しかし例えばACBを検索すると、CとBは隣り合っていてもAとCは隣り合ってないので、この時点でアウトです。 ちなみに同じ配列のインデックスの文字は2度使えません。例えば、ABCGBを検索すると、隣り合った文字同士なのでOKですが、同じインデックスにあるBを2度使っているのでアウトです。 以上のルールで、文字1つ1つを検索するプログラムを考えているのですが、どのようにすればいいのかがわかりません。 例えばAFCBを検索するとなると、まずAのまわりにFがあるかどうかを検索するので(Aは角なので)、[0][1],[1][0],[1][1]の3つを探せばいいだけですが(この場合は[1][1]=F)、 次にFの周りにCがあるかを検索すると計8つのインデックスの中身を調べなければなりません(この場合は[0][2]=C)。 そして最後にCの周りにBがあるかどうかで計5つのインデックスの中身を調べます(この場合[0][1]=B)。 常にFの検索のように3×3の検索ならfor文2つで簡単に出来ますが、検索する文字によっては角の検索になったり端の列の検索になったりと検索範囲が変わってしまいます。 しかも同じインデックスの中身は2度使えないのでもしそのインデックスにヒットしたら飛ばさなければなりません。 これをどのように検索すればいいのかがわかりません。全ての可能なケースのfor文を用意するとすごい長さになってしまいます。 どなたか宜しくお願いします。

  • Java
  • 回答数7
  • ありがとう数3

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

  • ベストアンサー
  • Yanch
  • ベストアンサー率50% (114/225)
回答No.7

> しかし最後に一つだけみおとしがあり、もし2次元配列に同じ文字が2つ以上あった場合の検索です。 > この場合何通りかの検索をしなければならないので、コードを変えなくてはいけません・・・ > 例えば > REDM > BANO > TQDF > LOEV > から、DOTを探すと、Dが2つあるので、最初の頭を探すループの時に、2つのDを記録して、2次元配列の検索を2回やらなければなりません。 > どのように工夫したらよいでしょうか。以下がコードです。アルゴリズムは変わってません。 その場合のアルゴリズムも考えてみましたが、結構複雑になるので、 残念ですが、説明しにくいです。 いくつか解法はあると思いますが、 ●開始位置の候補場所を列挙する。 ●全ての開始位置から、経路探索などの方法で、問題に一致する経路情報を作成する。 ●経路上から、重複する経路を削除する。 ●残った経路があれば、true、なければfalse と言った方法が有利じゃないかなと、想像してます。 経路情報を構造的に管理するなど必要ですが、これで解決出来ると思われます。 詳細の説明はご勘弁ください。

lockwell
質問者

お礼

ありがとうございます。 色々やってみたのですが、全てのケースで成功させることがなかなかできませんでした。 今回は同じ文字は2つまでしかないという幸いな条件があったのですが、やはり検索する文字によってエラーがでました・・・ むずかしいですね・・・。

その他の回答 (6)

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.6

● >> if ((j < 0) || (j >= row) || (0 > k) || (k >= col)) { > j == rowと、k == colの場合は、gameboardの範囲外ですよ。 元のままで問題なかったみたいです、ごめんなさい。 ● > あるいは文字がヒットした場合、2次元配列のループを最初に戻し、新しい検索対象のためのループにするために、一気にループを2つbreakする方法がわかりませんでした これは、 continute LOOP; とすれば、良いと思います。 ● もう一息という感じでありますね。

lockwell
質問者

補足

ありがとうございます。ループをぬける方法は、ラベルではなくわざとi、j、kの値を範囲外に設定してbreakさせました。 よって正常に動かすことができました。 しかし最後に一つだけみおとしがあり、もし2次元配列に同じ文字が2つ以上あった場合の検索です。 この場合何通りかの検索をしなければならないので、コードを変えなくてはいけません・・・ 例えば REDM BANO TQDF LOEV から、DOTを探すと、Dが2つあるので、最初の頭を探すループの時に、2つのDを記録して、2次元配列の検索を2回やらなければなりません。 どのように工夫したらよいでしょうか。以下がコードです。アルゴリズムは変わってません。 public class DiceTray { private char[][] gameboard; private int row, col; private char[][] work; public DiceTray(char[][] array) { row = array.length; col = array[0].length; gameboard = array; work = new char[row][col]; } public boolean stringFound(String search) { boolean blt = false; int nowRow = 0, nowCol = 0; int charValueArgsLength = search.length(); char[] charValueArgs = new char[charValueArgsLength]; int searchLength = charValueArgsLength - 1; search.getChars(0, charValueArgsLength, charValueArgs, 0); for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (gameboard[i][j] == charValueArgs[0]) { nowRow = i; nowCol = j; break; } else { blt = false; } } } work[nowRow][nowCol] = charValueArgs[0]; for (int i = 1; i <= searchLength; i++) { for (int j = (nowRow - 1); j <= (nowRow + 1); j++) { for (int k = (nowCol - 1); k <= (nowCol + 1); k++) { if ((j < 0) || (j > row - 1) || (0 > k) || (k > col - 1)) { continue; } else if (charValueArgs[i] == gameboard[j][k]) { if (work[j][k] == gameboard[j][k]) { blt = false; i = searchLength + 1; j = nowRow + 2; k = nowCol + 2; } else { blt = true; nowRow = j; nowCol = k; work[j][k] = charValueArgs[i]; j = nowRow + 2; k = nowCol + 2; } } else { if (j == nowRow + 1 && k == nowCol + 1) { i = searchLength + 1; j = nowRow + 2; k = nowCol + 2; } else { blt = false; } } } } } for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { work[i][j] = ' '; } } return blt; } }

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.5

● > if ((j < 0) || (j >= row) || (0 > k) || (k >= col)) { j == rowと、k == colの場合は、gameboardの範囲外ですよ。 ● 少しコメントを入れるようにしましょう。 あと、メソッド化できそうな部分は、メソッド化です。 ● >     for (int i = 0; i < row; i++) { >       for (int j = 0; j < col; j++) { >         work[i][j] = ' '; >       } >     } work の初期化を最後の方でやっているつもりみたいですが、 かならず通とは限らないように見えます。 ●コメントの例     /*      * 最初の1文字目の位置を探す      */     for (int i = 0; i < row; i++) {       for (int j = 0; j < col; j++) {         if (gameboard[i][j] == charValueArgs[0]) {           nowRow = i;           nowCol = j;           break;         } else {           blt = false;         }       }     } など ● ちゃんと見てないですが、bltを用いて、判定しているみたいですが、 bltのtrue、falseの切り替えがわかりにくい様に見えます。 この部分をtraceしなおす等すると、バグを見つけやすくなると思います。

lockwell
質問者

補足

お世話になります。バグを一つみつけたのですが、どうなおしたらいいかがわかりません 以下は2次元配列の中から検索対象の文字を探すループです LOOP: for (int i = 1; i <= searchLength; i++) { //検索する文字のインデックス分繰り返す。 for (int j = (nowRow - 1); j <= (nowRow + 1); j++) { //2次元配列のループ(列) for (int k = (nowCol - 1); k <= (nowCol + 1); k++) { //2次元配列のループ(行) if ((j < 0) || (j > row-1) || (0 > k) || (k > col-1)) { ////もし範囲外ならcontinue continue; } else if (charValueArgs[i] == gameboard[j][k]) { //もしヒットすれば以下の処理 if (work[j][k] == gameboard[j][k]) { //もしそのインデックスの中身が2度目なら以下の処理 blt = false; i = searchLength + 1; //ループ処理を全て終了させるため、iの値を範囲外に設定 break LOOP; } else { //2度目じゃなければ以下の処理 blt = true; nowRow = j; nowCol = k; work[nowRow][nowCol] = charValueArgs[i]; //使ったインデックスの中身を記録 break LOOP; } } else { //ヒットしなければ以下の処理 blt = false; } } } } for (int i = 0; i < row; i++) { //work配列を初期化 for (int j = 0; j < col; j++) { work[i][j] = ' '; } } return blt; ここで、iの値が2以上いかないというエラーがでます。例えばAEGPを検索する場合、AEまでしか検索していないみたいなのです これでは本来falseを返すはずがtrueを返してしまいます どのように直したらよいでしょうか。ラベルがまずかったでしょうか。 しかし、検索する文字が隣り合っていないとわかった時点でループ全てを一気にbreakして最後のreturnにいきたく、 あるいは文字がヒットした場合、2次元配列のループを最初に戻し、新しい検索対象のためのループにするために、一気にループを2つbreakする方法がわかりませんでした

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

当該インデックスの文字を使ったかどうかを覚えておくフラグでも作るかな. あと, 「検索する文字列に決して現れない文字」があるなら, 与えられた文字配列を拡張して「そのような文字」を周囲に配置しておくと「はみ出したかどうか」の判定はしなくて済みます. 実行時の速度を気にしなくていいなら, 「このような設定を行うドライバメソッド」と「実際に探索を行う再帰的探索メソッド」に分割したほうが楽かもしれない.

lockwell
質問者

補足

ありがとうございます。先ほど少し変えてみたのですが、2つほエラーがでてしまいます public class DiceTray { private char[][] gameboard; private int row, col; private char[][] work; public DiceTray(char[][] array) { row = array.length; col = array[0].length; gameboard = array; work = new char[row][col]; } public boolean stringFound(String search) { boolean blt = true; int nowRow = 0, nowCol = 0; int charValueArgsLength = search.length(); char[] charValueArgs = new char[charValueArgsLength]; int searchLength = charValueArgsLength - 1; search.getChars(0, searchLength, charValueArgs, 0); for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (gameboard[i][j] == charValueArgs[0]) { nowRow = i; nowCol = j; break; } else { blt = false; } } } work[nowRow][nowCol] = charValueArgs[0]; LOOP: for (int i = 1; i <= searchLength; i++) { for (int j = (nowRow - 1); j <= (nowRow + 1); j++) { for (int k = (nowCol - 1); k <= (nowCol + 1); k++) { if ((j < 0) || (j >= row) || (0 > k) || (k >= col)) { continue; } else if (charValueArgs[i] == gameboard[j][k]) { if (work[nowRow][nowCol] == gameboard[j][k]) { blt = false; i = searchLength + 1; break LOOP; } else { blt = true; nowRow = j; nowCol = k; work[nowRow][nowCol] = charValueArgs[i]; break LOOP; } } else { blt = false; } } } if ((blt == true) && (i == searchLength)) { return blt; } } for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { work[i][j] = ' '; } } return blt; } } エラーとは、1つ目は、ABAやABBといった同じ文字を2度使う場合trueを返してしまうことと、 2つ目は、DIEといった1文字目と2文字目が隣り合っていない文字の検索の場合期待通りの結果を出すのですが(falseを返す)、 DHFJといった1文字目と2文字目が隣り合った文字の時のfalseを返す場合、trueが返ってきてしまいます。 ラベルを使って少し簡単にしたのですが、どのようにエラーを直せばよいかがわかりません。 どなたかご教授お願いします

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.3

> if (周りにi文字目の文字があるか?(r, c)) { ←この部分でどう検索したらいいのかがわかりません。 > 質問欄にも書きましたように、角の検索、端の行列の検索、中の検索で検索範囲が変わり検索方法を変えないといけないように思えます。 > ABCGBを検索する場合、Gはその周りの8つの検索になるのでfor文2つを普通に回せば出来ますが、Aの周りのBを検索する時にGと同じやり方をすると配列の範囲外を検索することになってしまいエラーがでます。 > 同様にBの周りを検索すると、その周りの5つの検索だけでよく、Bより上のインデックスは配列の外になってしまいます。 > if (周りにi文字目の文字があるか?(r, c)) { ←このif文の中身は、上であげた角、行列、中、全ての場合の検索をif文で分けてかかないといけないのでしょうか。 そこのところも工夫してあげれば、 for (int j = (r - 1); j <= (r + 1); j++) {   for (int k = (c - 1); k <= (c + 1); k++) {     if (jが範囲外 || kが範囲外) {       continue;     }     文字をチェック(j, k);   } } のような感じにすれば、それほど複雑にはならないと思われますよ。

lockwell
質問者

補足

お世話になります。自分なりに組んでみたのですが、調べる検索値によってエラーが出てしまいます。 以下のように組んで見ました。ちなみに4×4の中のマスはchar型で、検索する対象はString型なのでchar型に直して検索します public class DiceTray { private char[][] gameboard; private int row, col; private char[][] work; public DiceTray(char[][] array) { row = array.length; col = array[0].length; gameboard = array; work = new char[row][col]; } public boolean stringFound(String search) { boolean blt = true; int r = 0, c = 0, count = 0, count2 = 0; int length = search.length(); char[] charValue = new char[length]; search.getChars(0, length, charValue, 0); //String型のsearchをchar型の配列に変換 for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (gameboard[i][j] == charValue[0]) { r = i; c = j; count++; break; } else { blt = false; } } if (count > 0) break; } count = 0; work[r][c] = charValue[0]; for (int i = 1; i < length; i++) { for (int j = (r - 1); j <= (r + 1); j++) { for (int k = (c - 1); k <= (c + 1); k++) { if (j < 0 || j >= row || 0 > k || k >= col) { continue; } else if (gameboard[j][k] == charValue[i]) { if (work[j][k] == charValue[i]) { System.out.println(j+" "+k+" "+work[j][k]+" "+charValue[i]+" "+i); count++; count2++; blt = false; break; } else { blt = true; r = j; c = k; work[r][c] = charValue[i]; count++; break; } }else{ blt = false; if(j==r+1 && k==c+1){ count++; break; } } } if (count > 0) break; } if(count2>0) break; } for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { work[i][j] = ' '; } } return blt; } } あまりうまくはないと思いますが・・・例えば検索する文字がABAだった場合、これはAが2度使われているのでfalseです。しかしtrueを返してしまいます。 他にDHGFを検索すると、trueを返すはずですがfalseが返ってきます。 ABFEJINMでtrueを返す場合やACBでfalseを返すのはできるのですが、DHGFなどの間違いを直すと今度は動いてたはずのABFEJINMなどの例が間違いになってしまいます。 間違いを何度探してもエラーがでてしまいてづまってしまいました。 どのようになおしたらよいでしょうか?宜しくお願いいたします ちなみに4×4のマスは以下のをテストクラスから受け取ってきます。 A B C D E F G H I J K L M N O P

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

ちょっくらrubyで書いてみた: KW = 'AFCB'; DIR2 = [[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]]; $Map = DATA.readlines.collect{|s|s.chop.split( // ); } $VRAM = $Map.collect{|e|Array.new( e.length ); } $Dir1 = []; ( 1 ... $Map.length-1 ).each{|i|( 1 ... $Map[0].length-1 ).each{|j| $Dir1 << [i,j]; } }; def explore( kw, idx, dir, tracker, &block ) yield( tracker ) if kw.length == idx; c = kw[ idx ]; x0, y0 = tracker[ -1 ]; dir.each do |vec| x = x0 + vec[0]; y = y0 + vec[1]; if $Map[ x ][ y ] == c && $VRAM[ x ][ y ] != 1 then tracker << [ x, y ]; $VRAM[ x ][ y ] = 1; explore( kw, idx + 1, DIR2, tracker, &block ); $VRAM[ x ][ y ] = nil; tracker.pop; end end end explore( KW, 0, $Dir1, [[0,0]] ) do |tracker| tracker.shift; tracker.each{|pos| p [ pos[0], pos[1], $Map[ pos[0] ][ pos[1] ] ]; } end __END__ ABCD EFGH IJKL MNOP 実行結果はこんな感じ: C:\>ruby a.rb [1, 1, "A"] [2, 2, "F"] [1, 3, "C"] [1, 2, "B"] ってやってる事は、No.1さんの回答と似たようなもんだったり。

lockwell
質問者

補足

すみません、rubyはわからないです・・・

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.1

こんな感じでイメージは掴めるじゃない? public class Sample {      private String[][] map = {       {"A", "B", "C", "D"},       {"E", "F", "G", "H"},       {"I", "J", "K", "L"},       {"M", "N", "O", "P"}};      private String[][] work = null;      public static void main(String[] args) {     Sample app = new Sample();     System.out.println(app.test("ABCGB"));   }      public boolean test(String testString) {     最初の1文字目の位置を探す。     r = 最初の1文字目の行     c = 最初の1文字目の列     if (最初の1文字目が見つからない) {       return false;     }     ワーク配列をクリア(work);     使用済み文字にマーク(r, c);          for (int i = 1; i < testString.length(); i++) {       if (周りにi文字目の文字があるか?(r, c)) {         if (その文字の位置は使用済みであるか?) {           return false;         }         r = i文字目の行         c = i文字目の列         使用済み文字にマーク(r, c);       }     }     return true;   } } > 全ての可能なケースのfor文を用意するとすごい長さになってしまいます。 そのような印象は受けませんよ。

lockwell
質問者

補足

どうもありがとうございます。質問なのですが、  if (周りにi文字目の文字があるか?(r, c)) { ←この部分でどう検索したらいいのかがわかりません。 質問欄にも書きましたように、角の検索、端の行列の検索、中の検索で検索範囲が変わり検索方法を変えないといけないように思えます。 ABCGBを検索する場合、Gはその周りの8つの検索になるのでfor文2つを普通に回せば出来ますが、Aの周りのBを検索する時にGと同じやり方をすると配列の範囲外を検索することになってしまいエラーがでます。 同様にBの周りを検索すると、その周りの5つの検索だけでよく、Bより上のインデックスは配列の外になってしまいます。 if (周りにi文字目の文字があるか?(r, c)) { ←このif文の中身は、上であげた角、行列、中、全ての場合の検索をif文で分けてかかないといけないのでしょうか。 すると少々長くなってしまい不恰好かなと思いました。これを短くスマートに出来る方法はありませんでしょうか?

関連するQ&A

  • 多次元配列の初期化

    多次元配列の初期化を行いたいのですが、 下記の方法では、配列の値が多くなったときに大変 なので他に良い方法はありませんでしょうか? char lesson[7][6] = { {'A', 'B', 'C', 'D', 'E', 'F'}, {'G', 'H', 'I', 'J', 'K', 'L'}, {'M', 'N', 'O', 'P', 'Q', 'R'}, {'S', 'T', 'U', 'V', 'W', 'X'}, {'Y', 'Z', 'a', 'b', 'c', 'd'}, {'e', 'f', 'g', 'h', 'i', 'j'}, {'k', 'l', 'm', 'n', 'o', 'p'}, };

  • VBAで2次元配列を使ってセル検索がしたいです。

    VBAを使って開発をしています。 セル検索なのですが、検索範囲のセルに対し、 C言語のような配列を作って格納してまず1列検索し、 対象が見つかったらアクションを起こして、 次の行へ移ってまた検索…を繰り返すということが したいです。 しかし範囲指定でRangeを使う場合、 "A1:A12"と指定しなければならないようで、 これでは固定入力になってしまい、"A1:A12"の次に "B1:B12"、"C1:C12"…と検索を続けられなさそうです。 なにかいい方法はないものでしょうか?

  • 多次元配列を、1次元の配列にする関数を書いてください。

    以下のように、多次元配列の配列をペチャンコにする関数(array_flatten)ってどうかきますか? <?php $arr[0] = 'a'; $arr[1][0] = 'b'; $arr[1][1][0] = 'c'; $arr[1][1][1][0] = 'd'; $arr[1][1][1][1][0] = 'e'; $arr[1][1][1][2] = 'f'; $arr[1][1][2] = 'g'; $arr[1][2] = 'h'; $arr[2] = 'i'; function array_flatten($arg){   処理; } $new_arr = array_flatten($arr); print_r($new_arr); ?> ↓ Array (   [0] => a   [1] => b   [2] => c   [3] => d   [4] => e   [5] => f   [6] => g   [7] => h   [8] => i ) ※関数のなかで、ペチャンコの配列を格納するための新しい配列を宣言すると、 同関数を再帰的に呼び出したら、その配列が初期化されますよね?

    • ベストアンサー
    • PHP
  • 配列の検索について質問です

    配列の中身を検索し、指定した文字を含む文字列を配列から取り出して表示させたいですのです。 文字列が.indexOfで検索できるのはわかったのですが、配列のからの検索がよくわからない状態です。 どなたか知恵をお貸しいただけないでしょうか。 よろしくおねがいします。 例 配列の中身 日本東京 アメリカワシントン イギリスロンドン 指定文字:アメリカ 出力:アメリカワシントン という形にしたいです。

  • VBAの一次元配列から二次元配列へ

    A列にa1~a100まで数字が入ってます。 それを、b1~b5,c1~c5,…省略 u1~u5までに、データを 5行ずつ移したいのです。 b1にはa1、b2にはa2の値を、u5にはa100の値を入れたいのです。 マクロの自動記録?を使うとできることはできるのですが…。 一次配列→二次配列で、出来ると聞いたことがあるのですが。 ※VBAは全くの初心者です。 コードに説明もつけてくださるとすごく助かります。 どうかよろしくお願いいたします。

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

    ある配列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
  • 多次元配列のキーをつないで文字列にする

    PHP5.4の配列で仮に次のようなものがあったとします。 <?php $arr['A']['B']['C']['D'] = null; $arr['A']['B']['D']['C'] = null; $arr['A']['B']['D'] = null; それぞれのキー名をつなぎあわせてそれぞれ「A, B, C, D」「A, B, D, C」「A, B, D」といった文字列に変換したいのですが、どのようにしたら実現できるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • csvファイルを開かずに文字を検索し行を抽出したい

    フォルダの中に複数のCSVファイルが有ります。 これらのファイルを開かずに文字列を検索し、検索対象の文字と完全一致する 文字がある行をまとめてひとつのファイルに抽出する方法を探しています。 例:Aフォルダ内にファイル1、ファイル2、ファイル3、、、と複数のファイルがある。 ファイルのフォーマットはすべてCSV。ファイルにはシートは一つのみ。日付なのですべて異なります。       A         B  C   D   E   F  G   H   I   J  K   L 加工年月日時分 品種 コード A列 B列 C列 D列 E列 F列 G列 本数 作業者    ・    ・    ・ A~Lまであり、Cのコードが指定した検索文字と完全一致するものを抽出したいです。 急ぎの内容の為、VBAやコマンドプロンプトなど、自分なりに色々なサイトにある プログラムを組み換えようとしましたが初心者の為すぐに理解して応用はとても 無理でした。知恵を貸して頂きたいです。

  • PHPで2次元配列を1次元配列にしたいのですが、わからないので教えてく

    PHPで2次元配列を1次元配列にしたいのですが、わからないので教えてください。 例えば2次元配列を以下のようにします。 $ss[0][0]=a $ss[0][1]=b $ss[0][2]=c $ss[1][0]=あ $ss[2][0]=い $ss[3][0]=う これを以下のような1次元配列にしたいです。、 $ss[0][0]→$g[0],$ss[0][1]→$g[1],$ss[0][2]=$g[2] $ss[1][0]→$h[0],$ss[2][0]→$h[1],$ss[3][0]=$h[2] よろしくお願いします。

    • ベストアンサー
    • PHP
  • 多次元配列のスマートな書き方

    $key文字列の:区切りで階層化した多次元配列に$valを代入するのですが 階層が深くなるにつれてcaseの記述も増えるため、ほとんど無限?に深くても 代入できるように(イ)の部分を変えたいのですが、スマートに記述する方法はありますか? <?php $key = "A:B:C"; ////$key = "A:B:C:D:E:F:G"; // この場合はcase 7まで書かなければならない? $val = "test"; $soe = split(":", $key); // -------------------------- イ switch (count($soe)) { case 1: $atr[$soe[0]] = $val; break; case 2: $atr[$soe[0]][$soe[1]] = $val; break; case 3: $atr[$soe[0]][$soe[1]][$soe[2]] = $val; break; default: print "ERR!"; exit; } // -------------------------- イ print_r($atr); exit; ?>

    • 締切済み
    • PHP

専門家に質問してみよう