• ベストアンサー

2次元配列から1次元配列へのデータ読み込み方法をお尋ねします。

いつもお世話になります。 readtest.csvというCSVファイルを作り、データを次のように入れています。 a,apple,301,23 b,orange,518,47 c,grape,278,19 d,banana,189,36 この3列目のデータを取り出して1次元配列に入れるため、DBtest.phpを次のように書きました。 01: <?php 02: $Data=file("../readtest.txt"); 03: for ( $i = 0; $i < sizeof( $Data ); $i++ ) { 04: $line=explode(",",$Data[$i]); 05: echo $line[2]; // 301518278189 06: // $xdata=implode(",", $line[2]); 07: } 08: ?> この実行結果は、「301518278189」となります。なぜコンマが入らないのでしょうか? 5行目をコメントアウトして6行目を生かして実行すると、 Warning: implode() [function.implode]: Bad arguments. in C:\Program Files\Apache Group\Apache2\htdocs\DBtest.php on line 6 となります。 3列目のデータを抜き出して配列を作るにはどのようにすれば良いでしょうか? よろしくご教示頂ければ幸いです。

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

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

  • ベストアンサー
  • wp_
  • ベストアンサー率54% (132/242)
回答No.2

// fileを$Dataに格納 $Data=file("../readtest.txt"); for ( $i = 0; $i < sizeof( $Data ); $i++ ) {  // $i行目のデータをカンマで区切り$lineに格納  $line=explode(",",$Data[$i]);  // $lineの3番目のデータをecho  echo $line[2];  // ←? $lineの3番目のデータをカンマで結合しようとしてる  $xdata=implode(",", $line[2]); } $line[2]は当然「配列ではない」のでimplodeで結合しようとしても空振りに終わるだけです。 Bad argmentsと怒られているのはそのせいです。 おそらくやりたいこととしては // $buffer: 取っておきたい3番目のデータを一時的に格納するバッファ $buffer = array(); $Data=file("../readtest.txt"); for ( $i = 0; $i < sizeof( $Data ); $i++ ) {  $line=explode(",",$Data[$i]);  $buffer[] = $line[2]; } echo implode(',',$buffer); こういうことなのかなぁと。

spindle
質問者

お礼

> $line[2]は当然「配列ではない」ので なるほど、そういうことですか・・・・・。 バッファを使った上のやり方で、将にやりたい結果を確認することができました。 しかし、私にとっては少し内容が高度なので、もう少し勉強します。 ありがとうございました。

その他の回答 (1)

回答No.1

<?php /* >この実行結果は、「301518278189」となります。なぜコンマが入らないのでしょうか? コードどおりなので,何を悩んでいるのか回答者としては良く理解できない。 言っておくけど,一回のechoで表示された内容じゃないからね。 echo $line[2] . "\n"; とかやってみればわかると思うけど。 で,さらに何のためにimplode関数を使おうとしているのか良く解らん。 */ $array = array(); /* ファイル名が説明文と一致しないので修正 */ $Data=file("./readtest.csv"); for ( $i = 0; $i < sizeof( $Data ); $i++ ) { $line=explode(",",$Data[$i]); array_push($array,$line[2]) ; } print_r($array); ?>

spindle
質問者

お礼

> echo $line[2] . "\n"; > とかやってみればわかると思うけど。 をやってみましたら、(縦に並ぶと思ったところ)、案に相違して「301 518 278 189」と半角スペースが空きました。 > 一回のechoで表示された内容じゃないからね。 は、分かっているのですが、なぜコンマがつかないのかが感覚的に理解できないでいます。 もう一度よく突っ込んで勉強することにします。 ありがとうございました。

関連するQ&A

  • 配列データをCSVでダウンロードしたい

    こんばんは。お世話になっております。 題名にある「配列データをCSVで・・」に関して、2つほど質問があり投稿させていただきます。 ヤフーのAPIを利用しているのですが(テストしている段階)、検索結果は提供されたデータが配列に格納されており、それを展開して検索結果として出力しています。 と、ここで、その結果をCSVでダウンロードすべく、配列データをimplodeで配列に収めて別ファイルにGETで渡し、渡されたデータをexplodeで配列に戻し、 header("Pragma: cache;"); Header("Content-type:application/vnd.ms-excel; charset=Shift_JIS"); header("Content-Disposition: inline; filename=$fname.csv");//ファイル名は一意な名前にしています。 $csv_line = implode("\n", $items); print(mb_convert_encoding($csv_line, "SJIS", "UTF-8")); と、やっております。 そこで質問なのですが、まず1つめ。APIで提供されているデータはUTF-8なので、上記のようにmb_convert_encoding()を使っていますが、文字化けでダウンロードしたデータを読むことが出来ません。 このような場合の対処の仕方は、どのようにすれば良いのでしょうか? また、2つ目の質問ですが、配列データをCSVでダウンロードするために、配列データを別ファイルに渡しているのですが、上記のようなやり方では、implodeで変数に代入すると文字列が長すぎて、正常にデータを渡すことが出来ません。 当初はCSVを生成するときもヤフーに接続して・・と行っていたのですが、これだと2度アクセスすることになり(1日のアクセス数の上限が定められている)、出来れば1度のアクセスで得たデータを利用したいと考えているのですが、このような場合、配列データを別ファイルに渡すにはどのようにするのが理想なのでしょうか?(セッションの利用も試したが上手くいきませんでした)

    • ベストアンサー
    • PHP
  • phpでcsvファイルから二次元配列を作る

    php初心者です。 phpでcsvファイルを読み込んで、 配列[csvの行番号][項目名(csv一行目の内容)]=各々の値 という二次元配列を作りたいのですが、作り方が全く分かりません。 どなたか教えてください。

    • ベストアンサー
    • PHP
  • 二次元配列について

    C#を使っています。 エクセルのデータを、カンマ区切り(CSV)にして保存しました。 そのデータをそのまま二次元配列に代入していきたいのですが、うまくできません(><) データの一行目しか代入しなかったりします。。二行目にうつってくれません。まだまだ初心者なのですが、どうか教えてください(><)

  • 配列n番目のデータの取得をしたい。

    初歩的な質問で恐縮です。 2次元配列形式で作った CSVファイル moromoro.txtがあります。 <?php $CsvData = fopen("./moromoro.txt","r"); $line=fgetcsv($CsvData,50,"\t"); print_r($line); ?> としてブラウザでみると Array ( [0] => abcd,efgh,kimn,qrst,uvwx)  とデータが入ります。ところが、データを取り出すため、 以下の通り4行目を追加しブラウザで見ても白いページだけになります。 01: <?php 02: $CsvData = fopen("./moromoro.txt","r"); 03: $line=fgetcsv($CsvData,50,"\t"); 04: list($aaa,$bbb)=$line; 05: return $aaa; 06: print_r($aaa); 076: ?>  ---------- 4行目以下を次のように変更しても 04: $ccc[]=$line[2]; 05: print_r($ccc); 06: ?> Array ( [0] => )  とだけが出てデータの取得が出来ません。何故でしょうか? どうすれば、配列n番目のデータを取り出すことができるでしょうか?

    • 締切済み
    • PHP
  • AWKの配列内データの処理について

    AWKを使用して入力ファイルの1行内の単語に対して条件チェックするには for( i=1 ; i<= NF i++ ){    if( $I == chek_word )       処理 } とすればできるのはわかるのですが、 一旦、配列の中に格納した文字列に対して上記の処理と同様の処理をするにはどのようにすればいいのでしょうか? 例えば data_line[$1] = $0; として配列data_lineに格納した1行そのままのデータに対して1番上の行全体にわたる単語の条件チェック をおこないたいのですが、どのようにすればいいのかよくわかりません。 どなたかご存知の方アドバイスをお願いします。

  • 多次元配列のオーソドックスなファイル書き込みについて教えてください

    PHP勉強中のAJAMAです。 下記にありますようなプログラムによって配列構造を持った変数をCSVファイルに書き込み、一行を1レコードとして管理をしたいと考えています。書き込み処理は、一意である変数の場合は、きっちりと書き込まれるのですが、配列変数の部分はarrayと書き込まれてしまいます。配列変数の中身を書き込むには、join(",",$xxxx)とすることで、すべてを同じ一行に書き込むことができました。しかしこれですと、すべてが、,区切りの二次元構造になってしまうので、これらのデータを読み込んで活用したい場合に、多次元構造を把握する処理をしなくてはいけないように見えるのですが、どうにもその仕組みを思考することができないので、模範的な手法を教えていただけないでしょうか。 serialize()も試してみましたが、知識がオブジェクト指向にまでいたっていないこともあり、うまくいきませんでした。(実行環境がPHP4だからかもしれません) 以 下、作成中のソースコードです。                     ※$numから右が配列変数部 $lines=array("$recordID",$nickname,$date,$area,$num,$item,$size); $lines=implode(",",$lines); $lines=$lines."\n"; serialize($lines); ←試行して不成功だった加筆部分。 //CSVファイルに書き込み $fp=fopen("report.csv","a"); flock($fp, LOCK_EX); fputs($fp,$lines); fclose($fp); 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • jspでの二次元配列

    こんにちは。初めて質問させていただきます。よろしくお願いします。 現在javaで作ったプログラムをjspでも使えるようにしようと考えているのですが、 二次元配列がうまくjspで反映されず困っています。 jspに関してはほとんど無知で一から勉強している次第です。 そのためなるべく簡単に、と思い 以下のプログラムを、<% %>の間に入れるだけで動かせないかと思ったのですが エラーが出てしまいました。一次元の配列ならばできたのですが... ちなみに以下のプログラムはcsvファイルを読み込み、 多次元配列に格納していくというものです。 稚拙なプログラムで申し訳ありません... どなたかご教授いただければ幸いです。 import java.io.*; import java.util.StringTokenizer; import java.util.ArrayList; class Dog{  public static void main(String args[]) throws IOException{      String csv = "dognum.csv";      BufferedReader br = new BufferedReader(new FileReader(csv)); String[][] array = new String[100][]; int i = 0; while (true) { String line = br.readLine(); if(line==null) break; array[i] = line.split(","); i++; } for (i = 0; i < 101; i++) { for (int j = 0; j < array[i].length; j++) { System.out.println("["+i+"]["+j+"] = " + array[i][j]); } } } }

  • 配列のbindValue方法について

    <環境> サーバーOS:CentOS webサーバー:apache データベース:MySQL PHP5.2 現在、上記の環境でwebアプリを作成しています。 データベースにデータを登録する際にPDOを使用しているのですが、 二次元配列に格納されているデータを bindValue() できずに困っています。 データが多く、個数もその都度変化するので、二次元配列に格納しています。 簡易的ではありますが、以下のようなソースコードになります。 <ソースコード> $dataArray → データが格納されている二次元配列 $columns = array(':id', ':name'); → プレイスホルダー名を格納している配列 for($i = 0; $i < count($dataArray); $i++) { $stt = $dataBase -> prepare('insert into tb_test(id, name) values(:id, :name)'); for($j = 0; $j < count($dataArray[ i ]); $j++) { $stt -> bindValue($columns[ $j ] ,$dataArray[ $i ][ $j ]); } $stt -> execute(); } 二次元配列の1行分のデータをループで bindValue() してから execute() で実行しています。 これを二次元配列の行数回繰り返しています。 apacheのエラーログには特に何も表示されていませんが、 登録処理ができません。 このような forループ では実行できないのでしょうか?

    • 締切済み
    • PHP
  • csvファイルを2次元配列に格納

    Javaの勉強をしています。 csvファイルを読み込んで2次元配列に格納する方法を教えて下さい。 1次元の配列なら下記のようにして出来たのですが、2次元の配列に格納する方法が分かりません。 ------------------------------ try { File csv = new File("xxx.csv"); BufferedReader brf = new BufferedReader(new FileReader(csv)); while(brf.ready()) { String line = brf.readLine(); String[] data = line.split(","); for(int j=0; j<data.length; j++) { System.out.print(data[j] + "\t"); } System.out.println(); } brf.close(); } catch(FileNotFoundException e) { e.printStackTrace(); } catch(IOException e) { e.printStackTrace(); } --------------------------- 一度はできないのかと思い、上記の1次元配列のdata[j]を2次元配列のarray[i][j]に代入してみたのですが出来ませんでした。 回答宜しくお願い致します。

    • ベストアンサー
    • Java
  • 読み込んだデータを配列へ代入する方法

    ---ここから--- 1,2 3,4 ---ここまで--- このようなファイルを読み込んでデータを配列へ格納するには, $pathname="D://data.txt"; open MYFILE, "$pathname"; @list=<MYFILE>; for($i=0;$i<2;$i++){ @dat=split(/,/,$list[$i]); print @dat; } close MYFILE; といったようなforあるいはwhileで1つの配列(上の場合だと@dat)に1行のデータを繰り返し入れていく方法しか思い浮かびません。できれば1行目のデータは@dat1という配列へ,2行目のデータは@dat2という配列へ,といったように行ごとに別々の配列へ代入させたいのですが良い方法はないでしょうか。 もしくは@dat=([1,2],[3,4])のような2次配列の形にでもできれば最高なのですが、、、

    • ベストアンサー
    • Perl

専門家に質問してみよう