我有一个循环遍历目录的类(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"
}
]
}
答案 0 :(得分:4)
使用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);
}
}
答案 1 :(得分:0)
为什么你在for循环中有中断?这将退出循环......
答案 2 :(得分:0)
这正是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);
}
}