替代PHP中的while循环

时间:2016-04-15 10:52:04

标签: php loops

我正在努力发展我对php的理解,非常感谢任何帮助。我使用了一个while循环来比较我的表单中发布的一些值和存储在csv文件中的值。 这段代码效果很好。但是,是否可以使用FOR EACH循环甚至Do Until来实现相同的结果?或两者??非常感谢任何支持

$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 个答案:

答案 0 :(得分:2)

while是此任务的最适合的语句,因为您要在执行任何读取之前检查 EOF

您可以将其转换为do-while(PHP中没有do-until)作为练习:

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的不好方法。

关于foreach,引用文档

  

foreach构造提供了一种迭代数组的简单方法。 foreach仅适用于数组和对象,并且当您尝试在具有不同数据类型或未初始化变量的变量上使用它时会发出错误。

你可以customize iteration over objects,这让你(警告,外行语言)在“自定义对象”上使用foreach,这样你就可以在某种程度上扩展功能foreach 例如,要迭代CSV文件,您可以使用此类

<?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;
    }

}
?>

并以这种方式使用

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

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

产生类似

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

此文件

0,Far Cry 3
1,Far Cry Primal
2,Alien Isolation