- ベストアンサー
2次元の配列にデータを格納したい
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> ただ、作成しているものがどうしてもうまくいきません。 どう「うまくいかない」のか、がないのですが、スクリプトを解析して問題点を指摘して欲しい、ということでしょうか、、、 補足に書かれたスクリプトの問題点を挙げますので、参考にしてみてください。 ・コンストラクタで IO::File を使っているが、use していない。 ・get_rows の先頭と main 先頭での変数への代入式が誤っている。それぞれ my($this)->shift; ↓ my($this) = shift; my($tbl)->new Table "File"; ↓ my($tbl) = new Table "File"; ちなみに、get_rows のように引数が複数ある関数では、 my ($this,$index,$key) = @_; と書くことができます。 ・オブジェクトの生成で、data の持ち方がおかしい(これが一番問題)。 "data" => "@data", では、$tbl->{data} の内容は「リファレンス値を列挙した文字列」になってしまいます。ここでは配列データを持たせるべきなので "data" => \@data, とします。ダブルクォートは付けてはいけません。 こうすると、$tbl->get_data の戻値もリファレンスになるので、受け取る側は my $data = $tbl->get_data; のようにし、各要素へのアクセスは、 $data->[$row][$col] のようにします。 まずはリファレンスについての理解を深めることを勧めます。 リファレンスについてのドキュメント http://www.kt.rim.or.jp/~kbk/perl5.005/perlref.html 2次元配列の扱いに関するドキュメント http://www.kt.rim.or.jp/~kbk/perl5.005/perllol.html
その他の回答 (2)
- leaz024
- ベストアンサー率75% (398/526)
> 行数と列数を@dataから取得する方法があればおしえてください。 行数は $rows = @data; 列数は $cols = @{$data[0]}; で取得できます。 ただし、「列」の部分については「無名配列」を使って動的に生成しているので、ファイル内容に不備があると、行ごとの列数が一定でなくなってしまいます。 例えば、万が一 hoge.txt A 1 B 2 7 C 3 なんてことになっていたりすると、2次元配列の内容も同じように 行\列 0 1 2 0 A 1 なし(列数2) 1 B 2 7 (列数3) 2 C 3 なし(列数2) のようになってしまいますので、ファイルの生成には注意が必要です。 ※Perlには、C言語などのような「完全な2次元配列」を定義する方法がなく、「配列の各要素に別の配列を割り当てる」という方法で実現しているため、このような問題が起こり得ます。
- leaz024
- ベストアンサー率75% (398/526)
可能です。下記サンプルをお試しください。 open FILE, "hoge.txt" or die 'ファイルが開けません。'; @data = (); while (<FILE>) { chomp; push @data, [ split /\s+/ ]; } close FILE; print $data[0][0]; # A print $data[0][1]; # 1 print $data[1][0]; # B print $data[1][1]; # 2 ・ファイルの読み込みでは、foreach ではなく、while を使います。foreach でも出来なくはないのですが、効率がよくありません。 ・while (<FILE>) で読み込んだデータは、特殊変数 $_ に入ります。引数を指定しない chomp や split では、この $_ が対象となります。 ・[ split /\s+/ ] では、空白区切りで分割したデータのリストを初期値として、無名配列を生成しています。配列の要素が配列となるので、2次元配列として使用することが出来ます。
補足
ありがとうございます。 追加で申し訳ないですが、行数と列数を@dataから取得する方法があればおしえてください。
関連するQ&A
- 多次元配列の扱い方
PHPバージョン5.2.4を使っています。 次のような文字列が入っている多次元配列を foreachなどのループを使ってその値を取り出して扱いたいのですが、 取り出した値には配列(二次元以降の値)も含まれてるので 簡単には取り扱いできません・・・ print_rやvar_dumpを使えば値は全て表示されるのですが、 あくまで表示ではなくて値を取り扱いたいのです。 そのようなことができる関数などはあるのでしょうか? $arr[0][0] = 'a'; $arr[0][1] = 'b'; $arr[1] = 'c'; $arr[2][0][0][0] = 'd'; $arr[2][0][0][1] = 'e'; foreach ($arr as $value) { $value//←ここで値を扱いたいけど、配列も含まれてるので・・・ }
- 締切済み
- PHP
- Generic.Listに1次元配列の配列を格納したい(VB2005)
VB2005の質問です。 変数ghogeにString型の1次元配列の配列を格納したいと考えています。 ----------------------------------------------- 'a) Dim hoge()() As string = _ {New string() {"a1", "b1", "c1"}, _ New string() {"a2", "b2", "c2"}, _ New string() {"a3", "b3", "c3"}} Dim ghoge As New Generic.List(of ) 'b) MessageBox.Show(ghoge(1)(1)) ' "b2"と表示したい ----------------------------------------------- 質問内容は、(a)を(b)の初期値として設定するにはどのようにすればよいか、ということです。 (b)がGeneric.ListでなくArrayListの場合だと、 Dim ghoge As New ArrayList(hoge) でhoge配列を格納できますが、Generic.Listの場合はどのような構文にすればよいでしょうか。 現在は、下記のような処理でghogeに値を格納しています。 ------------------------------------------------------------ Dim ghoge As New Generic.List(Of Generic.List(Of String)) Dim aryhoge1 As New Generic.List(Of String)(New String() {"a1", "b1", "c1"}) Dim aryhoge2 As New Generic.List(Of String)(New String() {"a2", "b2", "c2"}) gary_hoge.Add(ary_hoge1) gary_hoge.Add(ary_hoge2) MessageBox.Show(gary_hoge(1)(1)) ' "b2"と表示される ------------------------------------------------------------ どうぞよろしくお願い致します。
- ベストアンサー
- Visual Basic
- C# 配列の配列(多次元配列?)
C#において、配列の配列中に格納した値を、検索することを 行いたいのですが、格納した値そのものを見ることができません。 まだ、C#を始めて間もないので、配列に格納する時点で、 不備があるかも知れませんが、お願いします。 やりたいこと ・テキストファイル内にある値を、2次元配列または、多次元配列に格納 ・配列に格納した値で、データチェックなどを行う予定 テキストファイル内のデータは、下記内容となり要素数も固定ではなく変動する A=1,2,3・・・ B=11,22,33・・・ 実際のソースは、 //配列 ArrayList list = new ArrayList(); //配列格納 1レコード毎用 ArrayList listtmp = new ArrayList(); while ((strGenderTextLine = objReader.ReadLine()) != null) { string strBuffer; //「=」前の値格納用変数 string[] strBuffer2; //「=」後の値格納用配列 listtmp=null; //strtmpに「=」前の値を格納 strtmp = TextLine.Split('=').GetValue(0).ToString(); //strtmp2に「=」後の値を格納(配列) strtmp2 = TextLine.Split('=').GetValue(1).ToString().Split(','); for (int i = 0; i <= strtmp2.Length - 1; i ++) { //[i,0]に、「=」前の値を代入 if (i == 0) { listtmp.Add(strtmp); } else { listtmp.Add(strtmp2[i].ToString()); } } //list配列にlistTmp配列を格納(配列の配列) list.Add(listtmp); intT = intT + strtmp2.Length; //行数カウント intTLine = intTLine + 1; } ここから、配列「list」内に入っている値を閲覧することができる方法を教えていただければと思います。 宜しくお願いいたします。
- ベストアンサー
- C・C++・C#
- 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
- PHPで配列の検索方法
PHPで下のような2次元配列があったとします。(りんご=a、みかん=bのような意味です。CSVからデータを2次元配列に格納したものです。) $data[0][0]="りんご" , $data[0][1]="a" $data[1][0]="みかん" , $data[1][1]="b" $data[2][0]="ばなな" , $data[2][1]="c" $data[3][0]="ぶどう" , $data[3][1]="d" ここで下のような1次元配列$hogeがあったとき $hoge[0]="ばなな" , $hoge[1]="りんご" 新たに1次元配列$hogehogeを用意して、2次元配列の中から"りんご"や"ばなな"に対応する文字列を探し出して $hogehoge[0]="c" , $hogehoge[1]="a" と、格納したいのですが、やり方がわかりません。 イメージとしまして、 $hoge[0]→($data[0][0]~$data[3][0]の中から探す)→($data[2][0]であるとわかる)→($data[2][0]に対応するのは$data[2][1]だとわかる)→($hogehoge[0]=cと格納) もし分かる方がおられましたらお願いします。
- ベストアンサー
- PHP
- 多次元配列への格納
よろしくお願いします。 多次元配列に値を格納したいのですが、これまでは、 $test = array ( 'father' => array ('hiroshi', 'toshi'), 'mother' => array ('hanako', 'yoshiko'), ); のように予め書かれてあるデータを使ってきましたが、この度やりたいのはある一つの通常の配列を20ずつ多次元配列に自動的に格納するスクリプトを作りたいと思っています。 $test = array ('hiroshi','toshi','masao',.....);と続く配列を、 $test = array ( 0 => array ('hiroshi',......(20個)), 1 => array (.......), ); と20ぐらいに区切って多次元配列にしたいです。 $test[0]に直接pushしたらWarning: array_push() [function.array-push]: First argument should be an array in..と叱られてしまいました。 どなたかわかる方がいましたらおしえてください。
- ベストアンサー
- PHP
- 多次元配列の並び変えについて
<?php $food["a"]["1"]= "hoge1"; $food["b"]["2"]= "hoge2"; $food["c"]["3"]= "hoge3"; $food["d"]["4"]= "hoge4"; ?> 上記の配列について、1,2,3,4のキーの順番でソートしたいのですが、うまく出来ません。 一次元配列だと簡単なのですが、二次元配列だとどうやったらよいのでしょうか? array_multisortを使うと、多次元でも並び変えはできると他のサイトで読みましたが、 これは結局値でソートしてますよね? 私は純粋にキーのみでソートしたいのですが、色々調べているのですがどうも複雑なプログラムを 書かないとできないような気がしてきました。
- 締切済み
- PHP
- 文字列になっている配列を‥
以下の値がDBに文字列の項目に登録されています。 DB から値を取得したのはいいのですが文字列なので foreach でグルグルしようとすると怒られてしまいます。 配列の型に変換できればいいのですが(array)だとうまく行かないしどうすればいいかどなたかご教授願えないでしょうか。 よろしくお願いします。 ■値(文字列でDBに格納されてます‥) array( 1=>'a', 2=>'b', 3=>'c', 10=>array( 'A'=>1, 'B'=>'hoge1', ), 11=>array( 'A'=>2, 'B'=>'hoge2', ), 12=>array( 'A'=>3, 'B'=>'hoge3', ), )
- 締切済み
- PHP
- PHPで多次元配列を一度に処理するには
例えば、 array( [hoge1-1] => hoge1-1_value [hoge1-2] => array( [hoge2-1] => hoge2-1_value [hoge2-2] => hoge2-2_value [hoge2-3] => array( [hoge3-1] => hoge3-1_value ) ) ) のような多次元配列で、すべてのvalueに同じ処理を施すには foreachのなかにforeachを書いて処理するしかないのでしょうか。 もっと単純に、すべてのファイルを一度に処理できるようにする方法は ないでしょうか?
- ベストアンサー
- PHP
- MFCのCArrayを使った二次元配列
CSVファイルの内容をCArrayを使って二次元配列に 格納する処理を作っています。 CSVファイルの内容は A1,B1,C1 A2,B2,C2,D2 A3,B3 : のように、縦横のレコード数が決まっていません。 なので、CArrayのAddで動的に配列を拡張できたら 楽だと思い挑戦しているのですが、分かりません。 また、CArrayで作られた配列はdeleteしなくては いけないのですか? どなたかご教授お願いします。
- ベストアンサー
- C・C++・C#
補足
どうもありがとうございます。 ただ、作成しているものがどうしてもうまくいきません。ご助言いただければうれしいです。 2次元のテーブルファイルから全ての行を取得したり、指定した行を取り出すようなクラスを作りたいと思っています。new()では、指定したファイルのデータを全て2次元の配列に格納します。そして、メソッドでnew()で格納したデータを取得して処理をしたり、指定行を取り出すといった処理をしようと思います。しかし、sub側やmain側でnew()で格納したデータの値を取得することができません。 例えば package Table; #コンストラクタでは、指定したファイルをオープンしてデータを2次元の配列に格納しておきます。 sub new { my($this) = shift; my($file) = shift; my(@data) = (); my($rows) = 0; my($cols) = 0; my($fh) = new IO::File; if ($fh->open("$file")) { while (<$fh>) { chomp; push @data, [ split /\s+/ ]; } $fh->close; } else { エラー処理 } $rows = @data; $cols = @{$data[0]}; my($tbl) = {"name" => "$file", "data" => "@data", "rows" => "$rows", "cols" => "$cols"}; bless $tbl, $this; } #get_data()でデータを取得する sub get_data(){ my($this) = shift; return $this->{data} } sub get_rows() { my($this)->shift; my($indx) = shift; my($key) = shift; #$this->{data}から値を検索したいが$this->{data}からうまく値を取得できない。 } package main; my($tbl)->new Table "File"; my(@data) = $tbl->get_data(); #@dataを使って行ごとの処理とか指定した列の値を使って処理したい。