Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中while循环的替代方案_Php_Loops - Fatal编程技术网

PHP中while循环的替代方案

PHP中while循环的替代方案,php,loops,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 = fgetc

我正在努力发展我对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);

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

您可以在时将其转换为
do(PHP中只有
时才有
do),作为练习:

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);
但这只是在编写
的同时编写
的一种糟糕的方法

关于,引用文件

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

您可以使用(警告,外行语言)在“自定义对象”上使用
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;
    }

}
?>
对于此文件

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

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

您可以在
时将其转换为
do(PHP中只有
时才有
do),作为练习:

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);
但这只是在编写
的同时编写
的一种糟糕的方法

关于,引用文件

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

您可以使用(警告,外行语言)在“自定义对象”上使用
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;
    }

}
?>
对于此文件

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

不,对于从文件句柄读取,while是唯一合理的构造。Foreach需要知道结构的大小,以便提前循环并执行。。。while总是执行至少一个循环,即使文件长度为0。一旦找到游戏,我可能倾向于打破循环,而不是继续循环。。。。你为什么要把
$gameinfo[2]
$gameinfo[4]
用引号括起来(
)@GordonM啊,我明白了,所以for-each循环不可能确定迭代次数。但是,为什么即使文件长度为0,也至少执行一次循环会对do-while不利?你的意思是程序只是在浪费时间吗???@Mark Baker很好!!!我需要使用Break!是的,如果文件长度为零字节(因此只包含一个EOF标记)那么循环就没有什么可做的了。不,从文件句柄读取while是唯一合理的构造。Foreach需要提前知道要循环的结构的大小,并且执行…while总是要执行至少一个循环,即使文件长度为0。一旦发现了,我可能倾向于打破循环电子游戏,而不是继续循环…那你为什么要把
$gameinfo[2]
$gameinfo[4]
用引号括起来(
)@GordonM啊,我明白了,所以for-each循环不可能确定迭代次数。但是,为什么即使文件长度为0,也至少执行一次循环会对do-while不利?你的意思是程序只是在浪费时间吗???@Mark Baker很好!!!我需要使用Break!是的,如果文件长度为零字节(因此,除了一个EOF标记外,什么都不包含)那么循环就没有什么可做的了。非常感谢您花时间如此详细地回答我的问题。for each将花费我一点时间来了解我的想法,但我真的很感激您可以使用file()foreach作为另一种方法,
foreach(file(“file\u name\u goes\u here”)作为$line)
但这意味着将整个文件加载到内存中以创建数组。大文件=大内存使用量。@MissDizy扩展前面的注释,有一种更简单的方法(感谢):
foreach(array\u map('str\u getcsv',file('data.csv'))
。非常感谢您抽出时间详细回答我的问题。for each将花费我一点时间来了解我的想法,但非常感谢。我想您可以使用file()和foreach作为另一种方式
foreach(file(“file\u name\u goes\u here”)作为$line)
但这意味着将整个文件加载到内存中以创建数组。大文件=大内存使用量。@MissDizy扩展了前面的注释,有一种更简单的方法(感谢):
foreach(array\u map('str\u getcsv',file('data.csv'))