我有一个类,它循环遍历一个目录(5 张图像)并将每个图像转换为 base64 格式并填充一个数组。但是,foreach 循环似乎只循环一次。目录中有 5 个图像,因此它应该有 5 次迭代,数组也应该是 5 个不同的图像。
.PHP
require_once "Results.php";
require_once "ImageHelper.php";
class IntroImageHelper {
public static function GetImages()
{
$results = new Results();
$results->IntroImages = Array();
$dir = new DirectoryIterator("img/");
$ImageExists = false;
foreach($dir as $file)
{
if($file->isFile())
{
$ImageExists = $file->__toString();
break;
}
}
if($ImageExists)
{
$tempImage = new Results();
$tempImage->ImageName = $ImageExists;
$tempImage->ImageData = ImageHelperIntroSlides::DownloadImage($file);
array_push($results->IntroImages, $tempImage);
}
return $results;
}
}
输出:
{"IntroImages: [
{"ImageName": "image.png",
"ImageDate": "base64imagedata"
}
]
}
使用 break
语句将停止循环。您可以使用continue
跳过当前迭代的其余执行并转到下一个迭代,但在您的情况下,只需省略break
即可解决问题:
foreach($dir as $file) {
if($file->isFile()) {
$ImageExists = $file->__toString();
}
}
在您的情况下,一堆代码在循环之外,而它应该在循环内部:
foreach($dir as $file) {
if($file->isFile()) {
$ImageExists = $file->__toString();
}
if($ImageExists) {
$tempImage = new Results();
$tempImage->ImageName = $ImageExists;
$tempImage->ImageData = ImageHelperIntroSlides::DownloadImage($file);
array_push($results->IntroImages, $tempImage);
}
}
但您也可以将这两个语句结合起来:
foreach($dir as $file) {
if($file->isFile()) {
$tempImage = new Results();
$tempImage->ImageName = $file->__toString();
$tempImage->ImageData = ImageHelperIntroSlides::DownloadImage($file);
array_push($results->IntroImages, $tempImage);
}
}
这正是
break
要做的,它会打破循环。
如果只需要标记一个值,请删除中断并让迭代继续。
但在您的情况下,您不需要,为了检查,将您的循环更改为以下内容:
foreach($dir as $file)
{
if($file->isFile())
{
$tempImage = new Results();
$tempImage->ImageName = $file->__toString();
$tempImage->ImageData = ImageHelperIntroSlides::DownloadImage($file);
array_push($results->IntroImages, $tempImage);
}
}
为什么 for 循环中有中断?这将退出循环...