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
いいえ、ファイルハンドルから読み取るためには、唯一の分かりやすい構文が必要です。 Foreachでは、構造体のサイズを事前にループする必要があります。ファイルが0の長さであっても、常に少なくとも1つのループを実行します。 – GordonM
ループを続けるのではなく、ゲームを見つけたらループから脱出する傾向があります。なぜ '$ gameinfo [2]'と '$ gameinfo [4]'を引用符で囲んでいますか( '' ') –
@ GordonMああ、各ループでは繰り返し回数を決めることができないだろうが、ファイルが0であっても少なくとも1回はループを実行するのはなぜ悪いのだろう?長さ - プログラムがちょうど時間を無駄にしていることを意味しますか? – MissDizy