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を使ってます。
以上、よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/07/14 09:43:29
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:windofjuly No.2

回答回数2625ベストアンサー獲得回数1149

ポイント35pt

間違いが二箇所

ゼロ始まりだから文具は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";
id:taroemon

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

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


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

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

2010/07/14 09:42:52

その他の回答1件)

id:Mook No.1

回答回数1314ベストアンサー獲得回数393

ポイント35pt

まず、配列は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')
id:taroemon

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

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


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

大変参考になりました。

2010/07/14 09:39:52
id:windofjuly No.2

回答回数2625ベストアンサー獲得回数1149ここでベストアンサー

ポイント35pt

間違いが二箇所

ゼロ始まりだから文具は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";
id:taroemon

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

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


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

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

2010/07/14 09:42:52

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません