PHP中while循环的替代方案
我正在努力发展我对php的理解,非常感谢任何帮助。我使用while循环将表单中发布的一些值与存储在csv文件中的值进行比较。 这段代码运行良好。然而,使用FOR-EACH循环甚至Do-Until是否可能达到相同的结果??或者两者都有??非常感谢您的支持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
$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'))
。