2016-04-15 16 views
0

私はPHPの理解を深めようとしており、本当に助けていただければ幸いです。 whileループを使用して、フォームに投稿された値とcsvファイルに格納されている値とを比較しました。 このコードはうまくいきます。ただし、FOR EACHループを使用して同じ結果を達成することは可能ですか、Do Until ??または両方??あなたが任意の読み取りを行う前EOFをチェックするための任意のサポートPHPのwhileループの代わりに

$file_handle = fopen("games.csv", "r"); # identify which file is being used. 
while(!feof($file_handle)) 
{ 
$gameinfo = fgetcsv($file_handle); 
if ($gameinfo[0] == $_POST["gameID"]) 
{ 
$GameName = "$gameinfo[2]"; 
$GameCost = "$gameinfo[4]"; 
$GameFound = true; 
} 
} 
fclose($file_handle); 
+1

いいえ、ファイルハンドルから読み取るためには、唯一の分かりやすい構文が必要です。 Foreachでは、構造体のサイズを事前にループする必要があります。ファイルが0の長さであっても、常に少なくとも1つのループを実行します。 – GordonM

+0

ループを続けるのではなく、ゲームを見つけたらループから脱出する傾向があります。なぜ '$ gameinfo [2]'と '$ gameinfo [4]'を引用符で囲んでいますか( '' ') –

+0

@ GordonMああ、各ループでは繰り返し回数を決めることができないだろうが、ファイルが0であっても少なくとも1回はループを実行するのはなぜ悪いのだろう?長さ - プログラムがちょうど時間を無駄にしていることを意味しますか? – MissDizy

答えて

2

whileのための多くのおかげで、この作業に最適な文です。

あなたは運動として(PHPにはdo-untilはありません)do-whileでそれを変換することができます:

do 
{ 
    if (!feof($file_handle)) 
    { 
     $gameinfo = fgetcsv($file_handle); 

     if ($gameinfo[0] == $_POST["gameID"]) 
     { 
     ... 
     } 
    } 
} 
while(!feof($file_handle)); 

または短い

do 
{ 
    if (feof($file_handle)) 
     break; 

    $gameinfo = fgetcsv($file_handle); 

    if ($gameinfo[0] == $_POST["gameID"]) 
    { 
     ... 
    } 
} 
while(true); 

が、それはただwhileを書くための悪い方法です。 DOC

にforeachの構築物を引用foreachに関して

は、配列を反復処理するための簡単な方法を提供します。 foreachは配列とオブジェクトに対してのみ機能し、別のデータ型または初期化されていない変数を持つ変数で使用しようとするとエラーが発生します。

あなたはcustomize iteration over objects、これはあなたが、方法で、foreachの機能を拡張できるようにします(警告、素人言語は)「カスタムオブジェクト」にforeachを使用させることができます。あなたはこのクラスに

<?php 
class FileIterator implements Iterator 
{ 
    private $file_handle = null; 
    private $file_name; 
    private $line; 

    public function __construct($file_name) 
    { 
     $this->file_name = $file_name; 

     $this->rewind(); 
    } 

    public function rewind() 
    { 
     if (!is_null($this->file_handle)) 
      fclose($this->file_handle); 

     $this->line = 1; 
     $this->file_handle = fopen($this->file_name, "r"); 
    } 

    public function current() 
    { 
     return fgetcsv($this->file_handle); 
    } 

    public function key() 
    { 
     return $this->line; 
    } 

    public function next() 
    { 
     return $this->line++; 
    } 

    public function valid() 
    { 
     $valid = !feof($this->file_handle); 

     if (!$valid) 
      fclose($this->file_handle); 

     return $valid; 
    } 

} 
?> 

を使用して、このようにこのファイルのため

1: Array ([0] => 0 [1] => Far Cry 3) 
2: Array ([0] => 1 [1] => Far Cry Primal) 
3: Array ([0] => 2 [1] => Alien Isolation) 

のようなものを作る

$it = new FileIterator("game.csv"); 

foreach ($it as $line => $gameObj) 
{ 
    echo "$line: " . print_r($gameObj, true) . "<br/>"; 
} 

それを使用することができ、CSVファイルを反復する例えば
0,Far Cry 3 
1,Far Cry Primal 
2,Alien Isolation 
+0

このような詳細で私の質問に答える時間をとってくれてありがとうございました。それぞれのために少し時間がかかりますが、私の頭を浮かべるのに本当に感謝します – MissDizy

+0

これは、foreach(file( "file_name_goes_here")を$ lineとして実行する別の方法としてfile()とforeachを使用することができます) 'これはファイル全体をメモリにロードして配列を作成することを意味します。大きなファイル=大きなメモリ使用量。 – GordonM

+1

@MissDizy前のコメントを拡張すると、さらに簡単な方法があります(http://se1.php.net/manual/en/function.str-getcsv.php#114764のおかげで):foreach(array_map( 'str_getcsv' 、file( 'data.csv'))) '。 – cFreed