我研究了这个,直到我的大脑受伤。我找不到为什么我的for循环停止循环的单一解释。
基本上,我有一个php脚本从目录中提取图像并将它们放在图像库和轮播的页面上。我有它设置,以便图像随机化。我只想要一定数量的图像,例如2。
我正在使用这个循环:
$amount = 2;
for($i = 0; $i < $amount; $i++){
}
虽然它主要提供总共2张图像,但有时它只提供1张图像,而且众所周知它根本不会提供图像。
我的问题是:为什么循环完全低于指定的数量?是的,我尝试使用3,但这给了我3张不想要的图像。
以下是完整的脚本:
<?php
// Set a variable for the directory
$folderName = "Images/Gallery Images/thumbs/230x180/";
// Open specified directory
$folder = opendir($folderName);
// Amount of images to count to
$amount = 2;
$loadedImages = array();
// Read the directory
while($file = readdir($folder)){
// Check if file isn't a directory/sub-directory, we only want the images here...
if(strpos($file, '.') !== 0){
// Set image into an array
$images[$i]= $file;
// Move on to next image.
$i++;
}
}
// Count images upto predefined amount
for($i = 0; $i < $amount; $i++){
// Randomise the images, so we get completely random images each page load
$random_img = rand(1,count($images)-1);
// Check if array isn't empty
// Otherwise it was sometimes getting empty values as an image
if(empty($images[$random_img]) || !isset($images[$random_img])) {
// If so, try another one
$random_img = rand(1,count($images)-1);
}
// Check if image is already loaded
if(in_array($images[$random_img], $loadedImages)){
// If so, try another one
$random_img = rand(1,count($images)-1);
}
// If all images passes the conditions write them into the page
else {
// Echo out the image tag with the size attribute and src
echo '<img src="'.$folderName.$images[$random_img].'" alt="Photo '.pathinfo($images[$random_img], PATHINFO_FILENAME).'">';
// Add the image to the loadedImages array
array_push($loadedImages,$images[$random_img]);
// Unset each image in original array so we don't have double images
unset($images[$random_img]);
}
}
?>
<小时/> 修改:供将来使用。
感谢ThànhChungBùi的answer,我修改,更改并改进了我的代码。这是我使用的完整脚本:
<?php
// Set a variable for the directory
$folderName = "Images/Gallery Images/";
// Open specified directory
$folder = opendir($folderName);
// Amount of images to count to
$amount = 2;
// Set an empty array for the images
$images = array();
// Set an empty array for the loaded images
$loadedImages = array();
// Read the directory and set all images into the image array
while (false !== ($file = readdir($folder))) {
// Check if file is a regular file, we don't want directories or sub-directories, only images...
if (is_file($folderName . $file) == true) {
// Set image into the image array
array_push($images, $file);
// Move on to next image.
$file++;
}
}
closedir($folder);
// Count images upto predefined amount
for ($i = 0; $i < $amount; $i++) {
// Randomise the images
$random_img = array_rand($images);
// If a random image has already been loaded using the loadedImages array or is empty...
while (in_array($images[$random_img], $loadedImages) || empty($images[$random_img])) {
// Pick another random image
$random_img = array_rand($images);
}
// Get image width/height
list($width, $height, $type, $attr) = getimagesize($folderName . $images[$random_img]);
// Echo out the random image and set the width and data-width to be used later in JavaScript
echo '<img src="' . $folderName . $images[$random_img] . '" alt="Photo ' . pathinfo($images[$random_img], PATHINFO_FILENAME) . '" style="width:' . $width . 'px;" data-width="' . $width . 'px;">';
// Add the random image into the loadedImages array, so we can check against it
array_push($loadedImages, $images[$random_img]);
}
?>
答案 0 :(得分:1)
问题是你试图通过这个获得“未加载的图像”:
$random_img = rand(1,count($images)-1);
你可能期望加载一个新图像,但没有保证新的随机图像是真正的新图像,所以循环跳过没有打印任何东西。
您可能需要添加一些检查新随机图像的内容,如下所示:
while(in_array($images[$random_img], $loadedImages)){
$random_img = rand(1,count($images)-1);
}
用上面的代码替换for循环中的整个if else语句。
其他:
$random_img = rand(0,count($images)-1);
Read the directory
部分,我没有看到设置$i
的代码,$images[$i]= $file;
也可以更简单:$images[]= $file;
unset
函数(在else语句unset($images[$random_img]);
中)。 unset
从array
删除元素,但不删除重新索引数组。因此,您的代码会在某个时刻抛出Undefined offset
。 所以现在for循环中的代码可以是
$random_img = rand(0,count($images)-1);
while(in_array($images[$random_img], $loadedImages)){
$random_img = rand(0,count($images)-1);
}
echo '...';
array_push($loadedImages,$images[$random_img]);