次のような内容の「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を使ってます。
以上、よろしくお願いします。
間違いが二箇所
ゼロ始まりだから文具は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";
まず、配列は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] に入ってきます。
これはさすがに知ってたのですが、質問時に記入ミスしました。恥ずかしいです。
間違いのご指摘と丁寧な解説ありがとうございます。
大変参考になりました。
間違いが二箇所
ゼロ始まりだから文具は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
質問時の記入ミスです。初歩的な間違いで恥ずかしいです。
出力によって場合分けされたスクリプトが大変参考になりました。
ありがとうございました。
>ゼロ始まりだから文具は3、名前は1
質問時の記入ミスです。初歩的な間違いで恥ずかしいです。
出力によって場合分けされたスクリプトが大変参考になりました。
ありがとうございました。