人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPで下記のスクリプトを手直ししてください。
次のような内容の「test.csv」ファイルがあるとします。
番号,名前,身長,文具
1,田中,180,鉛筆
2,落合,170,消しゴム
3,小林,150,鉛筆
4,山本,190,筆箱

このうち、鉛筆を持ってる人の情報をすべてブラウザで表示する「hoge.php」はどのように作ったらよいのでしょうか?ただし、元のCSVファイルは変更しないようにします。つまりスクリプトを実行したら下記のように表示されるようにしたいです。
1,田中,180,鉛筆
3,小林,150,鉛筆

下記のようにしてみましたが、文具が鉛筆である人をすべて抜き出す方法と、echoの吐き出し方がよくわかりませんでした。
<?php
if( $handle = fopen( 'test.csv', 'r' ) ){
$names = Array();
while( ( $lines = fgetcsv( $handle ) ) !== FALSE ){
if( $lines[4] == '鉛筆' ){
$names[] = $lines[0];
}
}
}
?>

環境はVista、IE、Firefox、最新のXampp、PHP5、 EclipsePDT2を使ってます。
以上、よろしくお願いします。

●質問者: taroemon
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:CSV ECHO firefox hoge IE
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● Mook
●35ポイント

まず、配列は0が基底ですから、鉛筆は lines[3] に入ってきます。

名前だけなら(数字が先頭列なら、名前は2列目ですね)、

$names[] = $lines[1]; // (A')

でよいですが、「下記のように・・・」としたいなら、1行分の情報をすべて配列に入れる必要があります。


<?php
 $names = Array();
 if( $handle = fopen( 'test.csv', 'r' ) ){
 while( ( $lines = fgetcsv( $handle ) ) !== FALSE ){
 if( $lines[3] == '鉛筆' ){
 $names[] = $lines; // (A)
 }
 }
 }
 for( $i=0 ; $i<count($names) ; $i++ ) {
 print implode(",",$names[$i] )."<BR>\n"; // (B)
 }
?>

名前だけを表示するなら、(A) の部分を先のよう(A')に変更し、(B)の部分を下記のよう(B')にしてください。

 print $names[$i]."<BR>\n"; // (B')
◎質問者からの返答

>まず、配列は0が基底ですから、鉛筆は lines[3] に入ってきます。

これはさすがに知ってたのですが、質問時に記入ミスしました。恥ずかしいです。


間違いのご指摘と丁寧な解説ありがとうございます。

大変参考になりました。


2 ● うぃんど
●35ポイント ベストアンサー

間違いが二箇所

ゼロ始まりだから文具は3、名前は1

if( $lines[3] == '鉛筆' ){
 $names[] = $lines[1];

変数に格納してから出力する場合

<?php
 if( $handle = fopen( 'test.csv', 'r' ) ){
 $lines = Array();
 while( ( $line = fgetcsv( $handle ) ) !== FALSE ){
 if( $line[3] == '鉛筆' ){
 $lines[] = $line;
 }
 }
 }
 foreach( $lines AS $line){
 echo join(',', $line) . "\n";
 }

即座に出力する場合

<?php
 if( $handle = fopen( 'test.csv', 'r' ) ){
 while( ( $line = fgetcsv( $handle ) ) !== FALSE ){
 if( $line[3] == '鉛筆' ){
 echo join(',', $line) . "\n";
 }
 }
 }

テーブルにする場合

<?php
 echo "<table>\n";
 echo "<thead><th>番号</th><th>名前</th><th>身長</th><th>文具</th></thead>\n";
 echo "<tbody>\n";
 if( $handle = fopen( 'test.csv', 'r' ) ){
 while( ( $line = fgetcsv( $handle ) ) !== FALSE ){
 if( $line[3] == '鉛筆' ){
 echo '<tr><td>' . join('</td><td>', $line) . "</td></tr>\n";
 }
 }
 }
 echo "</tbody>\n";
 echo "</table>\n";
◎質問者からの返答

>ゼロ始まりだから文具は3、名前は1

質問時の記入ミスです。初歩的な間違いで恥ずかしいです。


出力によって場合分けされたスクリプトが大変参考になりました。

ありがとうございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ